2016-03-06 179 views
0

我想查询一个用户集合与多个嵌套对象,我不知道如何正确使用投影操作符(例如$),因为他们似乎为数组而不是对象工作。在MongoDB中查询嵌套对象

每个用户都有一个“booksRecords”对象,具有多个书对象(例如hc_1_3,hc_1_4等)。每个图书对象都有一个名为currLevel的字段,我试图找到至少有一个图书对象currLevel:'nursery'的孩子。

我试过 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仅适用于数组。 您需要使用$where来评估每个文档:

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