Mongoose-按条件查找子文档

我刚刚被这个问题缠住了。我有两个猫鼬模式:

var childrenSchema=mongoose.Schema({
姓名:{
类型:字符串
},
年龄:{
类型:数字,
最低:0
}
});
var parentSchema=mongoose.Schema({
姓名:{
类型:字符串
},
childrenSchema]
});

问题是,如何从每个父文档中获取所有子文档(在本例中为childrenSchema对象)?假设我有一些数据:

var父项=[
{姓名:“约翰·史密斯”,
儿童:[
{姓名:“彼得”,年龄:2},{姓名:“玛格丽特”,年龄:20}
]},
{姓名:“另一个史密斯”,
儿童:[
{姓名:“玛莎”,年龄:10},{姓名:“约翰”,年龄:22}
]}
];

我想在一个查询中检索所有18岁以上的儿童。可能吗?我们将感谢您的每一个回答,谢谢

在最新的MongoDB版本中,您可以使用$elemMatch作为查询投影操作符。来自mongo shell:

db.parents.find(
{'children.age':{$gte:18},
{儿童:{$elemMatch:{age:{$gte:18}}})

这将从children数组中筛选出较年幼的儿童文档:

{u id::,“children:[{”name:“Margaret”,“age:20}]}
{u id::…,“children:[{”name:“John”,“age:22}]}

如您所见,子文档仍然分组在其父文档中。MongoDB查询从集合返回文档。您可以使用聚合框架的$unwind方法将它们拆分为单独的文档:

>db.parents.aggregate({
$match:{'children.age':{$gte:18}
}, {
$unwind:“$children”
}, {
$match:{'children.age':{$gte:18}
}, {
$项目:{
名称:“$children.name”,
年龄:“$children.age”
}
})
{
“结果”:[
{
“_id”:ObjectId(“51a7bf04dacca8ba98434eb5”),
“姓名”:“玛格丽特”,
“年龄”:20岁
},
{
“_id”:ObjectId(“51a7bf04dacca8ba98434eb6”),
“姓名”:“约翰”,
“年龄”:22
}
],
“好”:1
}

我重复执行$match条款:第一次通过它消除了孩子至少18岁的父母,因此$unwind只考虑有用的文档。第二个$match删除不匹配的$unwind输出,$project将子文档的信息提升到顶层

发表评论