簡體   English   中英

如何在mongodb中查詢子文檔

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM