Node.js,mongodb和过滤后的查询

时间:2016-11-15 11:34:13

标签: node.js mongodb mongodb-query

我正在使用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"
        }
   }
}

但查询并没有返回任何内容!为什么呢?

1 个答案:

答案 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
})