[英]How to query sub document in mongodb
我有以下集合,其中包含程序列表,每個程序均包含會話列表:
{
"_id" : ObjectId("543f6fd8a4490a19b42c84eb"),
"Name" : "Program1",
"Tags" : "Tag1,Tag2",
"Sessions" : [{
"_id" : ObjectId("544a00716c6d791820c2d1ae"),
"Name" : "Session1",
"Tags" : "Tag1,Tag2"
},{
"_id" : ObjectId("544e426dbb63bc0d94d7ad81"),
"Name" : "Session2",
"Tags" : "Tag1,Tag2"
}]
},
{
"_id" : ObjectId("544e42a1bb63bc0d94d7ad82"),
"Name" : "Program2",
"Tags" : "Tag1,Tag2",
"Sessions" : [{
"_id" : ObjectId("543f6fd8a4490a19b42c84eb"),
"Name" : "Session1",
"Tags" : "Tag1,Tag2"
},{
"_id" : ObjectId("544e4cb1bb63bc0d24333b04"),
"Name" : "Session2",
"Tags" : "Tag1,Tag2"
}]
}
現在,對於查詢程序,我只需執行以下操作:
var program = _db.GetCollection<Program>("Program");
IMongoQuery _query = Query<Program>.Where(e => e.Name.Contains("Program"));
programCursor = MongoCursor program.Find(_query).SetSortOrder(SortBy.Ascending("Name")).SetLimit(ItemsPerPage).SetSkip(ItemsPerPage * (PageNo - 1));
現在,如果我要查詢作為子文檔的會話該怎么辦。 假設我已經有程序ID和會話名,那么我將如何在mongodb c#中查詢子文檔。 在這種情況下,我沒有找到太多幫助,這就是為什么我要發布此SO。
您可以使用以下查詢:
{"_id" : ObjectId("543f6fd8a4490a19b42c84eb"),"Sessions.Name":"Session2"}
輸出:
{
"_id" : ObjectId("543f6fd8a4490a19b42c84eb"),
"Name" : "Program1",
"Tags" : "Tag1,Tag2",
"Sessions" : [{
"_id" : ObjectId("544a00716c6d791820c2d1ae"),
"Name" : "Session1",
"Tags" : "Tag1,Tag2"
}, {
"_id" : ObjectId("544e426dbb63bc0d94d7ad81"),
"Name" : "Session2",
"Tags" : "Tag1,Tag2"
}]
}
或者可以使用聚合來獲取單個會話對象:
db.collection_name.aggregate([
{ $unwind : "$Sessions" },
{ $match : {"_id" : ObjectId("543f6fd8a4490a19b42c84eb"),"Sessions.Name":"Session2"} }
]);
輸出:
{
"result" : [
{
"_id" : ObjectId("543f6fd8a4490a19b42c84eb"),
"Name" : "Program1",
"Tags" : "Tag1,Tag2",
"Sessions" : {
"_id" : ObjectId("544e426dbb63bc0d94d7ad81"),
"Name" : "Session2",
"Tags" : "Tag1,Tag2"
}
}
],
"ok" : 1
}
您可以使用
IMongoQuery _query1 = Query<Program>.ElemMatch(e => e.Sessions, builder => builder.Matches(session => session.Name, "/.*" + search_phrase + ".*/"));
要么
IMongoQuery _query2 = Query<Program>.ElemMatch(e => e.Sessions, builder => builder.Where(session => session.Name.Contains(search_phrase)));
你可以And , 或者你的查詢
var query = Query.Or(new BindingList<IMongoQuery>
{
_query,
_query1,
....
});
var result = program.Find(query);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.