我想知道如何为 Mongoose 查询中匹配的对象数组设置投影。
例如,如果我有一个 Mongoose 模型,如下所示:
var User = new Schema({
name: String,
children: [Child]
});
var Child = new Schema({
name: String,
height: Number,
age: Number,
secret: Number
});
换句话说,可能从此模型产生的示例 JSON 对象:
User: {
name: 'abc',
children: [
{
name: 'def',
height: 123,
age: 7,
secret: 2
},
{
name: 'ghi',
height: 456,
age: 9,
secret: 3
}
]
}
正如你所看到的,模型包含一个属性children
这是一个数组Child
对象。
如果我只匹配User
包含一个项目children
拥有财产的name: 'def'
:
Users.find({
children.name: 'def'
})
然后我可以设置投影来选择属性(例如name
) 以及使用位置运算符 ($
):
.select({
name: 1,
children.$: 1
}
现在的问题是,通过这个投影,children.$
将始终返回整个Child
对象,包括我可能不想查询的属性,例如secret
.
{
name: 'abc',
children: [
{
name: 'def',
height: 123,
age: 7,
secret: 2
}
]
}
理想情况下,我希望也能够从child
通过获得的对象$
类似于如何name
从父对象中选择User
,但我找不到办法做到这一点。
选择单个属性的一种方法是使用格式children.$.age
但这只能用于选择 1 个属性,因为多次执行此操作会导致错误,因为您无法使用位置$
操作员多次。
.select({
name: 1,
// and now select the height and age
// but only of the child that matches name = 'def'
// WITHOUT returning the entire object (exclude name and secret)
children.$.age,
children.$.height // error
})
在 Mongoose 中可以为位置运算符获得的对象选择投影吗?