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