1

我没有要显示的代码,因为我不知道如何实现我想要的。

我已经读过可以从文档中返回子文档,但我还没有发现如何实际执行此操作。一个用户集合的人为示例:

[
   {
      "_id":0,
      "Name":"Person 1",
      "Cupboard":[
         {
            "_id":0,
            "Items":[
               {
                  "_id":1,
                  "Name":"item 1"
               },
               {
                  "_id":2,
                  "Name":"item 2"
               }
            ]
         }
      ]
   }
    ,
    {
      "_id":1,
      "Name":"Person 2",
      "Cupboard":[
         {
            "_id":0,
            "Items":[
               {
                  "_id":1,
                  "Name":"item 1"
               },
               {
                  "_id":2,
                  "Name":"item 2"
               }
            ]
         }
      ]
   }
]  

假设我知道橱柜的 _id,我如何只从橱柜中退回物品?我正在使用 C# 驱动程序,但即使在 mongo shell 中帮助它也会很有用。

4

3 回答 3

2

您需要做的就是仅投影您想要的字段。因此,在您的数据集上,仅从橱柜返回项目将是:

db.collection.find({ ... }, { 'Cupboard.Items' : 1, _id : 0 })
于 2013-08-01T11:08:11.763 回答
1

如果要返回许多Items,可以使用聚合框架$unwind将子项投影为查询结果。

http://docs.mongodb.org/manual/reference/aggregation/unwind/

然后使用$project返回结果Items

确保使用$match运算符在管道的早期过滤结果以利用索引。

您可以将管道创建为 BsonDocument。这是一个例子:

var match = new BsonDocument 
            { 
                { 
                    "$match", 
                    new BsonDocument 
                        { 
                            {"Cupboard.Items._id", 123} 
                        } 
                } 
            };

var match2 = new BsonDocument 
            { 
                /* other pipeline op */
            };

var pipeline = new[] { match, match2 };
var result = coll.Aggregate(pipeline);

但是,如果您想返回User孩子符合特定条件的文档(或部分文档),Item您可以简单地使用 find。

db.Users.find({'Cupboard.Items._id':1234})

希望有帮助

于 2013-08-01T11:25:43.573 回答
1

你可以做类似的事情

> db.users.find({"Cupboard._id": 0}, {"Cupboard.$" : 1}).pretty()

哪个会回来

{
        "_id" : 0,
        "Cupboard" : [
                {
                        "_id" : 0,
                        "Items" : [
                                {
                                        "_id" : 1,
                                        "Name" : "item 1"
                                },
                                {
                                        "_id" : 2,
                                        "Name" : "item 2"
                                }
                        ]
                }
        ]
}
{
        "_id" : 1,
        "Cupboard" : [
                {
                        "_id" : 0,
                        "Items" : [
                                {
                                        "_id" : 1,
                                        "Name" : "item 1"
                                },
                                {
                                        "_id" : 2,
                                        "Name" : "item 2"
                                }
                        ]
                }
        ]
}
>

但是,让我们更改我们的文档,以便我们拥有以下内容,以便我们的用户拥有多个橱柜和其中的一些不同物品

> db.users.find().pretty()
{
        "_id" : 0,
        "Name" : "Person 1",
        "Cupboard" : [
                {
                        "_id" : 0,
                        "Items" : [
                                {
                                        "_id" : 1,
                                        "Name" : "item 1"
                                },
                                {
                                        "_id" : 2,
                                        "Name" : "item 2"
                                }
                        ]
                },
                {
                        "_id" : 1,
                        "Items" : [
                                {
                                        "_id" : 1,
                                        "Name" : "item 1"
                                },
                                {
                                        "_id" : 2,
                                        "Name" : "item 2"
                                }
                        ]
                }
        ]
}
{
        "_id" : 1,
        "Name" : "Person 2",
        "Cupboard" : [
                {
                        "_id" : 0,
                        "Items" : [
                                {
                                        "_id" : 1,
                                        "Name" : "item 1"
                                },
                                {
                                        "_id" : 2,
                                        "Name" : "item 2"
                                }
                        ]
                },
                {
                        "_id" : 2,
                        "Items" : [
                                {
                                        "_id" : 21,
                                        "Name" : "item 1"
                                },
                                {
                                        "_id" : 22,
                                        "Name" : "item 2"
                                }
                        ]
                }
        ]
}

我们现在可以按用户列出所有橱柜。

db.users.aggregate([
    {$match: {"Cupboard._id": 0}},
    {$project: {"Cupboard._id": 1}}
])

{ "_id" : 0, "Cupboard" : [ { "_id" : 0 }, { "_id" : 1 } ] }
{ "_id" : 1, "Cupboard" : [ { "_id" : 0 }, { "_id" : 2 } ] }
于 2016-12-24T20:00:05.767 回答