我对Mongoose完全陌生.
我有这样的Schema:
const houseSchema = new mongoose.Schema({
_id: String,
housename: {type: String,unique: true},
adress: String,
people: [ {
name: String,
age: Number
} ],
});
和文档:
let house = new House({
_id: 20,
housename: "white",
adress: "St1",
people:[
{name: "Jon", age: 23},
{name: "Ann", age:50},
{name: "Pat", age:20},
{name: "Helen", age:15}]
});
我想按id查找此文档,并按年龄筛选人员数组,然后返回不带筛选对象的完整文档.因此,预期输出将是:(对于21岁):
{
_id: 20,
housename: "white",
adress: "St1",
people:[
{_id:"65976faeaa644d02c4090826", name: "Jon", age: 23},
{_id:"65976faeaa644d02c4090827", name: "Ann", age:50}
]
}
经过几个小时的try ,我对这个问题的解决方案是:
app.get("/api/test", (req, res) => {
var searchID = "20";
var minAge = 21;
House.aggregate([{$match: {_id: searchID}}])
.unwind("people").match({'people.age': {$gt: minAge}})
.group({
_id: "$_id",
people: {$push: "$people"}
})
.exec((err,data)=>{
res.json(data);
});
});
所以我首先匹配id,然后倒回People数组,这样我就可以过滤掉它,然后我try 重新加入到第一个形式.However after grouping I lose housename and adress fields.的输出如下:
{"_id":"20",
"people":[
{"_id":"65976faeaa644d02c4090826","name":"Jon","age":23},{"_id":"65976faeaa644d02c4090827","name":"Ann","age":50}]}
我不知道如何在输出中保持housename和adress字段.我已经try 添加.projection({housename:1,adress:1. });,但它什么也没做,我认为那些键在group()之后的管道中不存在.我也一直在考虑在match()之后将这些值保存到vars中,然后在最后添加它们,但我不知道如何在链的中间访问它们.