2015-01-17 5 views
0

рассмотреть следующие записи:Как запросить родителя на основе _id?

запись пользователя

{ 
"_id" : ObjectId("5234ccb7687ea597eabee677"), 
"class" : [ 
     { "_id" : ObjectId("5234ccb7687ea597eabee671", "num" : 10, "color" : "blue" }, 
     { "_id" : ObjectId("5234ccb7687ea597eabee672", "num" : 100, "color" : "blue" } 
     ] 
} 

этот пользователь имеет два класса суб записи, теперь мне нужен запрос, который находит все пользователи, которые имеют класс собственности, где «class._id» имеет значение, по меньшей мере, один пользователей «class._id»

здесь является более подробно пример:

suppos е есть четыре пользователя:

A:{_id:432645624232345,class:[{_id:123,name:'foo'}]} 
B:{_id:432645624232555,class:[{_id:555,name:'foo'},{_id:123,name:'foo'}]} 
C:{_id:432645344232345,class:[{_id:555,name:'foo'},{_id:111,name:'www'}]} 
D:{_id:432644444232345,class:[{_id:222,name:'sss'},{_id:555,name:'www'},{_id:123,name:'foo'}]} 

теперь, если B вход, мне нужно запросить все пользователь, чей класс поддокумент содержит, по меньшей мере, один документ, который это _ID == 555 или _id == 123 (555 и 123 приходят от B пользователь), в этом случае результат запроса должен быть:

A:{_id:432645624232345,class:[{_id:123,name:'foo'}]} // match _id=123 
B:{_id:432645624232555,class:[{_id:555,name:'foo'},{_id:123,name:'foo'}]} //match _id=123 and _id=555 
C:{_id:432645344232345,class:[{_id:555,name:'foo'},{_id:111,name:'www'}]} //match _id=555 
D:{_id:432644444232345,class:[{_id:222,name:'sss'},{_id:555,name:'www'},{_id:123,name:'foo'}]} ///match _id=123 and _id=555 

который является всем пользователем.

до сих пор я получаю это:

{"class._id" : { $in : ["5234ccb7687ea597eabee671", "5234ccb7687ea597eabee672"] } } 

но когда другой пользователь Войти при условии class._id запроса отличается. Есть ли у оператора какие-либо операторы?

{"class._id" : { $in : req.user.class } } 

Надеюсь, я поняла.

ответ

0

Для того, чтобы добиться того, чего вы хотите, сначала вы должны изолировать идентификаторы класса в массиве, а затем использовать его в аргументе запроса.

var classIds = []; 
var i = 0; 
while (i < req.user.class.length) { 
    classIds.push(req.user.class[i]._id); 
    i++; 
} 

После этого вы можете использовать ClassIDs массив в запросе:

{"class._id" : { $in : classIds } } 
+0

да, это работает, но мне было интересно, есть ли способ сборки для достижения этого в mongodb? – paynestrike

+0

Самый близкий к встроенному методу для этого, возможно, это: '{" class._id ": {$ in: req.user.class.map (function (item) {return item._id;})}}' – Schiller

0

следующее условие запроса даст вам все пользователи, которые имеют по крайней мере один класс с идентификатором равным одному из элементов в данном массиве:

{"class._id" : { $in : ["5234ccb7687ea597eabee671", "5234ccb7687ea597eabee672"] } } 

В массиве для пункта $in вы можете предоставить любой идентификатор, который вам нужен, разделен запятой.

Кроме того, если вам нужно, например, ниже условие запроса следует проверить наличие вложенного документа в свойстве «класса», который имеет свойство «_id»:

{ "class._id" : { $exists : true } } 

Оба условия должны работать независимо от того, "class._id" - однозначное свойство или массив (mongo поддерживает это).

+0

это выглядит, как он будет возвращать все пользователю! – paynestrike

+0

Вы ищете конкретный идентификатор подкласса или должен быть только поддокумент с идентификатором? –

+0

предположим, что user.class = [{id: 123}, {_ id: 321}], мне нужно найти всех пользователей, которые user.class = [{_id: 123}] или user.class = [{_id: 321} ] или user.class = [{id: 123}, {_ id: 321}] – paynestrike

Смежные вопросы