我只是被这个问题困住了.我有两个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岁以上的 children .可能吗?我们将感谢您的每一个回答,谢谢!

推荐答案

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

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

这将从children数组中筛选年幼 children 的文档:

{ "_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条款:第一次通过它消除了no个子元素至少18岁的父母,所以$unwind只考虑有用的文件.第二个$match将删除$unwind个不匹配的输出,$project将子文档中的 children 信息提升到顶层.

Mongodb相关问答推荐

Spring Data MongoDB中的@ Transactions(+测试容器)

我们可以在Mongoose中这样使用Unique:[True,";This to Unique&qot;]吗

在提供的文档(_Id)之后和之前,是否有一个Mongo操作来获取已排序(和/或过滤)集合中的文档计数?

MongoDB 聚合 groupBy 日期并计算子文档

定期自动轮换 MongoDb 集合

判断对象数组中的值是否存在golang

在 Mongo 聚合中,可以通过分组生成 3 个不同的计数

在 MongoDB 中,如何使用对当前值进行操作的函数来更新嵌套文档的值?

MongoDB:插入重复键更新

Mongodb插入没有_id字段的文档

如何更新 mongodb 文档以向数组添加新元素?

Spring Mongodb @DBREF

具有多个字段的mongodb文本搜索

如何解决 ClassNotFoundException:com.mongodb.connection.BufferProvider?

Python - Pymongo 插入和更新文档

使用 mongodb 在数组中查找子文档

如何通过键名从 mongoDB 中检索值?

未找到 MongoDB 数据/数据库

Mongoose 为所有嵌套对象添加 _id

全局初始化失败:BadValue Invalid or no user locale set.请确保正确设置 LANG 和/或 LC_* 环境变量