我正在使用mongodb的原生API,而我正在尝试查询我的收藏中的数据。 这是我的过滤器对象:
{
email: 'admin@email.it',
login: { '$exists': true }
}
这是一个应该找到的文件:
{
"_id": "5829cd89a48a7813f0cc7429",
"timestamp": "2016-11-14T14:43:18.705Z",
"login": {
"clientIPaddr": "::1",
"clientProxy": "none"
},
"userData": {
"sessdata": {
"sessionID": "CRTZaqpaUs-ep0J6rvYMBlQTdDakGwle",
"email": "admin@email.it",
"token": "3PlfQBVBoftlIpl-FizeCW5TbYMgcYTl4ZPTkHMVyxqv-TldWb_6U3eusJ27gtI64v7EqjT-KPlUUwkJK7hPnQ"
}
}
}
但查询并没有返回任何内容!为什么呢?
答案 0 :(得分:1)
它没有返回任何内容,因为email
字段位于userData
字段中的嵌入文档中,因此它会尝试在更高级别查找email
字段在文件中不存在。
要使其工作,您需要修改过滤器或创建一个包含嵌入字段的新查询对象,尽管该键位于点表示字段中,即查询应该类似于
{
"userData.sessdata.email": "admin@email.it",
"login": { "$exists": true }
}
您可以使用bracket notation创建必填字段。例如:
var filter = {
email: 'admin@email.it',
login: { '$exists': true }
},
query = {};
Object.keys(filter).forEach(function(key){
if (key === "email") {
query["userData.sessdata."+key] = filter[key];
} else {
query[key] = filter[key];
}
});
console.log(JSON.stringify(query, null, 4));
<强>输出强>
{
"userData.sessdata.email": "admin@email.it",
"login": {
"$exists": true
}
}
然后,您可以在find()
查询
collection.find(query).toArray(function(err, docs) {
// access the docs array here
})