Node.js,mongodb和过滤的查询

我正在使用mongodb的本地API,并试图查询我的集合上的数据。 这是我的过滤对象:

{ email: 'admin@email.it', login: { '$exists': true } } 

这是它应该find的一个文件:

 { "_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" } } } 

但查询不会返回任何东西! 为什么?

它不会返回任何内容,因为email字段位于userData字段内的embedded式文档中,因此它会尝试在不存在的文档中的较高级别查找email字段。

为了使这个工作,你需要修改filter或创build一个新的查询对象,其中包括embedded字段,尽pipe钥匙将在点表示字段即查询应该类似

 { "userData.sessdata.email": "admin@email.it", "login": { "$exists": true } } 

您可以使用括号表示来创build必填字段。 例如:

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