从Mongodb中检索子文档
本文关键字:文档 检索 Mongodb | 更新日期: 2023-09-27 18:25:51
我没有代码可以显示,因为我不知道如何实现我想要的。
我读到可以从文档返回子文档,但我还没有找到实际的方法。一个用户集合的人为例子:
[
{
"_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中帮助完成它也会很有用。
您所需要做的就是只投影您想要的字段。因此,在您的数据集上,只返回橱柜中的物品将是:
db.collection.find({ ... }, { 'Cupboard.Items' : 1, _id : 0 })
如果要返回许多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);
但是,如果要返回子Item
与特定条件匹配的User
文档(或其一部分),可以简单地使用find。
db.Users.find({'Cupboard.Items._id':1234})
希望对有所帮助
你可以做一些类似的事情
> 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 } ] }