当前位置: 首页 > 知识库问答 >
问题:

通过标准查找猫鼬子文档

夏青青
2023-03-14

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

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

var parentSchema = mongoose.Schema({
    name : {
        type: String
    },
    children: [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岁以上的儿童。有可能吗?每一个回答都将不胜感激,谢谢!

共有3个答案

屠德宇
2023-03-14

A.杰西·吉鲁·戴维斯的回应很有魅力,但是对于猫鼬(猫鼬5. x)的后续版本,我们会得到错误:

Mongoose 5. x禁止将运算符传播到Model.aggregate()。代替Model.aggregate({$匹配 }, { $skip}),执行Model.aggregate([{$匹配 }, { $skip}])

所以现在的代码就是:

> 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
}

(请注意查询周围的数组括号)

希望这对某人有帮助!

狄易安
2023-03-14

在Mongoose中,您还可以像这样使用优雅的.填充()函数

parents
.find({})
.populate({
  path: 'children',
  match: { age: { $gte: 18 }},
  select: 'name age -_id'
})
.exec()
百里业
2023-03-14

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

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

这将从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
}

我为性能重复$匹配子句:第一次通过它消除了没有至少18岁孩子的父母,所以$unWind只考虑有用的文档。第二个$match删除不匹配的$unWind输出,并且$project将子文档的信息提升到顶层。

 类似资料:
  • 问题内容: 我的文件 夹Folder 具有以下架构: 因此,对于每个页面,我可以拥有许多权限。在CMS中,有一个面板,其中列出了所有文件夹及其权限。管理员可以编辑一个权限并保存。 我可以很容易地用其权限数组保存整个 Folder 文档,其中只修改了一个权限。但是我不想保存所有文档(实际架构中包含更多字段),所以我这样做了: 但是问题是 烫发 总是 不确定的 !我试图以这种方式“静态地”获取许可:

  • 问题内容: 我刚刚陷入这个问题。我有两种猫鼬模式: 问题是,如何从每个父文档中获取所有子文档(在这种情况下为对象)?假设我有一些数据: 我想通过一个查询来检索所有18岁以上的孩子。每个答案将不胜感激,谢谢! 问题答案: 您可以在最新的MongoDB版本中用作查询投影运算符。从mongo shell: 这会从数组中过滤掉较小的儿童文档: 如您所见,子代仍在其父文档中分组。MongoDB查询返回集合中

  • 问题内容: 我陷入了异步算法: 我有一系列的猫鼬模型: 我想抓取每个集合的所有项目,并将它们放入数组或类似的内容中。如果这样做,则回调的关键字不会引用当前模型,因此我无法知道哪些模型项属于 我也尝试了异步库,但没有成功,因为我总是回到同一问题:无法知道哪个模型在回调内执行find查询。同上,如果我使用诺言。 请帮助我:)你会怎么做? EDIT model.find调用query.find,quer

  • 问题内容: 我在子文档的Mongoose中尝试执行findOne查询,但运气不佳… 我的架构如下所示: 我只需要从我使用此查询的文档中查找用户的电子邮件 任何帮助,将不胜感激! 问题答案: 您缺少对象的级别,因此您的代码需要更改为以下内容:

  • 问题内容: 我有一个猫鼬模型: 我想找到一个模型实例,修改它的属性,然后保存更改。这是我尝试过的(这是错误的!): 查找,修改和保存模型实例的语法是什么? 问题答案: 为什么不使用Model.update?毕竟,除了更新其属性之外,您没有将找到的用户用于其他任何用途:

  • 问题内容: 我在用猫鼬填充后无法通过在文档内部匹配的值来查询文档。 我的架构是这样的: 我想让所有用户拥有例如类型为“ Gmail”的电子邮件。 以下查询返回空结果: 我不得不像这样过滤JS中的结果: 有没有办法从猫鼬直接查询类似的东西? 问题答案: @Jason Cust 已经很好地解释了它- 在这种情况下,通常最好的解决方案是更改架构,以防止通过存储在单独集合中的文档的属性进行查询。 不过,这