查询mongodb中的嵌套对象

时间:2016-03-06 00:43:38

标签: mongodb

我正在尝试使用多个嵌套对象查询User集合,并且我不确定如何正确使用投影运算符(例如$),因为它们似乎适用于数组而不是对象。

每个用户都有一个" 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"
      }
    }
  }  
]

2 个答案:

答案 0 :(得分: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;
} }); 

答案 1 :(得分: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));
        }
    }
});