我的数据库架构有点像
{
"_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。数据量非常大&使用聚合将是一个性能瓶颈
答案 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