在MongoDB中查找并返回自定义结构

时间:2015-08-20 17:10:06

标签: mongodb

假设我在collection

中有这些数据
{ id: 1, age: 5, name: "Nick" }
{ id: 2, age: 7, name: "John" }
{ id: 3, age: 2, name: "Anna" }
{ id: 4, name: "Peter", children: [1,2,5] }
{ id: 5, age: 25, name: "Mat", children: [3] }

我想要一个查询,以这种形式返回 有孩子的人 命令他们的age

[
 { id: 4, name: "Peter", children: [
   { /* Nick's record */ },
   { /* John's record */ },
   { /* Mat's record */ }
 ] },
 { id: 5, name: "Mat", age: 25, children: [
   { /* Anna's record */ }
 ] }
]

注意:响应的children数组中的人也应按其age

排序

2 个答案:

答案 0 :(得分:1)

以下查询将检索具有子项的文档。但是这不能检索孩子的记录,你必须通过另一个查询来填充这些记录。在mongodb中不可能像在sql中那样真正的连接。

db.yourCollection.find({"children.0": {$exists:true}}).sort({age:1})

还有另一个功能,如数据库引用,可用于使用其ID从另一个集合中获取数据。但是您必须更改数据结构才能使用它们。有关详细信息,请查看以下内容:Database References

答案 1 :(得分:1)

请查看以下查询:

db.collection.find({children:{$exists:1}}).sort({age:1}).forEach(
            function(doc){
                      var printdoc = doc;
                      printdoc.children = db.collection.find(
                                        { id: { $in: doc.children }
                                        }).sort({age:1}).toArray();
              printjson(printdoc);
});

这将为您提供以下所需的输出:

{
        "id" : 4,
        "name" : "Peter",
        "children" : [
                {
                        "id" : 1,
                        "age" : 5,
                        "name" : "Nick"
                },
                {
                        "id" : 2,
                        "age" : 7,
                        "name" : "John"
                },
                {
                        "id" : 5,
                        "age" : 25,
                        "name" : "Mat",
                        "children" : [
                                3
                        ]
                }
        ]
}
{
        "id" : 5,
        "age" : 25,
        "name" : "Mat",
        "children" : [
                {
                        "id" : 3,
                        "age" : 2,
                        "name" : "Anna"
                }
        ]
}