2014-10-30 5 views
0

Я, имеющий следующий сбор, который содержит список программ и каждую программу, содержащий список сессий:Как запросить вспомогательный документ в 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)); 

Теперь, если я хочу запросить сессии, которые являются дополнительным документом. Предполагая, что у меня есть идентификатор программы и имя сеанса, как я буду запрашивать вспомогательный документ в mongodb C#. Я не нашел большой помощи в этом сценарии, поэтому я публикую это.

+0

В отличие от форумов, мы не используем «Спасибо», «Любая помощь оценена» или подписи на [so]. См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be -Удалена-от-сообщений). –

ответ

0

Вы можете использовать

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))); 

и вы можете И, Или для запросов

var query = Query.Or(new BindingList<IMongoQuery> 
{ 
    _query, 
    _query1, 
    .... 
}); 

вар результат = program.Find (запрос) ;

1

Вы можете использовать следующий запрос:

{"_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 
} 
Смежные вопросы