2016-03-06 4 views
0

Я пытаюсь запросить коллекцию пользователя с несколькими вложенными объектами, и я не уверен, как правильно использовать операторы проектирования (например, $), поскольку они, похоже, работают для массивов, а не для объектов.Запрос вложенных объектов в mongodb

Каждый пользователь имеет объект «booksRecords», имеющий несколько книжных объектов (например, hc_1_3, hc_1_4 и т. Д.). Каждый книжный объект имеет поле под названием currLevel, и я пытаюсь найти детей, у которых есть хотя бы один объект книги, где currLevel: «детская».

Я пробовал делать User.find ({'booksRecords. $. CurrLevel': 'nursery'}), но это, похоже, не работает, и мне интересно, какой правильный способ запросить вложенные объекты?

Я проверил Querying nested in mongoDB, но он отличается от моего случая, поскольку я запрашиваю вложенные объекты.

[ 
    //first object 
    { 
    _id: "xxx", 
    booksRecords: { 
     hc_1_3: { 
     markedRead: false, 
     currLevel: "elementary" 
     }, 
     hc_1_2: { 
     markedRead: false, 
     currLevel: "elementary" 
     } 
    } 
    }, 
    //second object 
    { 
    _id: "xyz", 
    booksRecords: { 
     hc_1_3: { 
     markedRead: false, 
     currLevel: "elementary" 
     }, 
     hc_1_2: { 
     markedRead: false, 
     currLevel: "nursery" 
     } 
    } 
    } 
] 

ответ

1

$ projection относится только массив. Чтобы оценить каждый документ, вам необходимо использовать :

db.User.find({ $where: function() { 
    for (var i=0 in this.booksRecords) { 
     if (this.booksRecords[i].currLevel === 'nursery') { 
      return true; 
     } 
    } 
    return false; 
} }); 
0

пожалуйста, вы можете это:

var userList = db.User.find(); 
var booksRecordsList={}; 

while(userList.hasNext()){ 
    var user = userList.next(); 
    for(var key in user.booksRecords){ 

     if (!(key in booksRecordsList)) { 
     booksRecordsList[key] = key; 
     } 
    } 
}; 

db.User.find().forEach(function(doc){ 
    for (var booksRecord in booksRecordsList){ 
     var booksRecordItem = doc.booksRecords[booksRecord]; 
     if(booksRecordItem.currLevel == "nursery"){ 
      print(tojson(doc)); 
     } 
    } 
}); 
Смежные вопросы