Mongodb嵌套查找

时间:2017-03-02 07:43:23

标签: mongodb mongodb-query

我的数据库架构有点像

{ 
    "_id" : ObjectId("1"), 
    "createdAt" : ISODate("2017-03-10T00:00:00.000+0000"), 
    "user_list" : [
        {
            "id" : "a", 
            "some_flag" : 1,  
        }, 
        {
            "id" : "b",
            "some_flag" : 0, 
        }
    ]
}

我想要的是获取文件 id是b & 用户b的some_flag为0

我的查询是

db.collection.find({
  'createdAt': {
    $gte: new Date()
  },
  'user_list.id': 'b',
  'user_list.some_flag': 1
}).sort({
  createdAt: 1
})

当我在shell中运行查询时。它返回id为1的doc(由于b的some_flag值为0,因此不应该这样)

这里发生的事情是,

  

查询' user_list.id':user_id 与嵌套对象匹配,其中" id" :b

     

' user_list.some_flag':1 与some_flag的嵌套对象匹配,其中" id":a(因为some_flag的值为1)

我应该做哪些修改来比较id& some_flag用于相同的嵌套对象。

P.S。数据量非常大&使用聚合将是一个性能瓶颈

2 个答案:

答案 0 :(得分:2)

您应该使用function sendData(postData, url){ var filteredData = {}; apiCall(postData,url).then(function (response) { for (var attr in response.data) { if (response.data.hasOwnProperty(attr)) { filteredData[attr] = response.data[attr]; } } console.log(filteredData.email); console.log(filteredData.count); }); } function apiCall(postData, postUrl){ return $http({ method : 'POST', url : postUrl, data : postData, headers : {'Content-Type': 'application/json'} }); } 否则$elemMatch查询将独立应用于数组项,因此在您的情况下,mongoDB将与ID为'user_list.some_flag': 1和{的数组项匹配{1}}将匹配ID为a的数组项。因此,如果您想使用'user_list.id': 'b'逻辑查询数组字段,请使用b,如下所示:

and

答案 1 :(得分:1)

你需要尝试类似的东西:

db.collection.find({
    'createdAt': {
        $gte: new Date()
    },
    user_list: {
        $elemMatch: {
            id: 'b',
            some_flag: 1
        }
    }
}).sort({
  createdAt: 1
});

这将只匹配user_list条目,其中_id是b而someflag是1