node.js – Mongoose – 按标准查找子文档

我刚刚遇到这个问题。我有两个Mongoose模式:

var childrenSchema = mongoose.Schema({
    name: {
        type: String
    },age: {
        type: Number,min: 0
    }
});

var parentSchema = mongoose.Schema({
    name : {
        type: String
    },children: [childrenSchema]
});

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

var parents = [
    { name: "John Smith",children: [
        { name: "Peter",age: 2 },{ name: "Margaret",age: 20 }
    ]},{ name: "Another Smith",children: [
        { name: "Martha",age: 10 },{ name: "John",age: 22 }
    ]}
];

我想在单个查询中检索所有18岁以上的孩子。可以吗?每一个答案都不胜感激,谢谢!

解决方法

您可以在最近的MongoDB版本中使用$ elemmatch作为查询投影运算符。从mongo shell:

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

这样可以将孩子们的小孩文档从儿童数组中过滤出来:

{ "_id" : ...,"children" : [ { "name" : "Margaret","age" : 20 } ] }
{ "_id" : ...,"children" : [ { "name" : "John","age" : 22 } ] }

正如你所看到的,孩子们仍然在他们的父母文件中分组。 MongoDB查询从集合返回文档。您可以使用聚合框架的$ unwind方法将它们分割成单独的文档:

> db.parents.aggregate({
    $match: {'children.age': {$gte: 18}}
},{
    $unwind: '$children'
},{
    $match: {'children.age': {$gte: 18}}
},{
    $project: {
        name: '$children.name',age:'$children.age'
    }
})
{
    "result" : [
        {
            "_id" : ObjectId("51a7bf04dacca8ba98434eb5"),"name" : "Margaret","age" : 20
        },{
            "_id" : ObjectId("51a7bf04dacca8ba98434eb6"),"name" : "John","age" : 22
        }
    ],"ok" : 1
}

我重复$ match子句的表现:第一次通过它消除了没有孩子至少18岁的父母,所以$解开只考虑有用的文件。第二个$ match删除不符合的$ unwind输出,$ project将子信息从子文档提升到顶层。

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...