Mongo +检查现有的多个字段

我正在和nodejs一起工作。

我有数组列表:

var checkFields = ["field1","field2","field3"]; 

我尝试获取具有数组列表字段的logging数,并且用户字段等于admin。

样本数据:

 [ { "checkFields": { "field1": "00124b3a5c31", "user": "admin" } }, { "checkFields": { "field2": "00124b3a5c31", "user": "admin" } }, { "checkFields": { "field1": "00124b3a5c31", "user": "regular" } } ] 

查询:

 db.collection_name.find( {"checkFields.user" : "admin"} { "checkFields.field1": { $exists: true} } ) 

预期结果:

结果是获得与数组list(checkFields)的字段匹配的计数行。

为字段存在检查列表build立一个$or数组是正确的方法,但是假设你在当前的node.js构build中,可以将查询创build简化为:

 var checkFieldsLists = checkFields.map(field => ({ ['checkFields.' + field]: {$exists: true} })); var query = { $or: checkFieldsLists, 'checkFields.user': 'admin' } 

这将删除多余的$or “用户是pipe理员”的检查,让您也可以删除外部$and ,以便生成的查询是:

 { '$or': [ { 'checkFields.field1': { '$exists': true } }, { 'checkFields.field2': { '$exists': true } }, { 'checkFields.field3': { '$exists': true } } ], 'checkFields.user': 'admin' } 

我试了下面的代码。 它的工作,但不知道它的良好的解决scheme和性能。 请任何人有更好的答案意味着请张贴。

 var checkFields = ["field1", "field2", "field3"]; var checkFieldsLists = []; for ( i = 0; i < checkFields.length; i++) { var jsObj = {}; jsObj['checkFields.' + checkFields[i]] = {}; jsObj['checkFields.' + checkFields[i]].$exists = true; checkFieldsLists.push(jsObj); } var query = { "$and" : [{ "$or" : checkFieldsLists }, { "$or" : [{ "checkFields.user" : "admin" }] }] }; console.log(JSON.stringify(query)); //console log will return /* {"$and":[{ "$or" : [{ "checkFields.field1" : { "$exists" : true } }, { "checkFields.field2" : { "$exists" : true } }, { "checkFields.field3" : { "$exists" : true } }] }, { "$or" : [{ "checkFields.user" : "admin" }] }] } */ collection.find(query); 

这是使用聚合查询的解决scheme。

 var Db = require('mongodb').Db, Server = require('mongodb').Server, assert = require('assert'); var db = new Db('localhost', new Server('localhost', 27017)); var checkFields = ["field1", "field2", "field3"]; var checkFieldsLists = []; for (var i = 0; i < checkFields.length; i++) { var jsObj = {}; jsObj['checkFields.' + checkFields[i]] = {}; jsObj['checkFields.' + checkFields[i]].$exists = true; checkFieldsLists.push(jsObj); } var query = { "$and" : [{ "$or" : checkFieldsLists }, { "$or" : [{ "checkFields.user" : "admin" }] }] }; var matchQuery = { "$match" : { "checkFields.user" : "admin", "$or" : checkFieldsLists } }; var groupQuery = { $group : { _id : null, count : { $sum : 1 } } }; var aggregateCheckFields = function(db, callback) { console.log("Match query is ====>" + JSON.stringify(matchQuery)); console.log("Group query is ====>" + JSON.stringify(matchQuery)); db.collection('checkfields').aggregate([ matchQuery, groupQuery ]).toArray( function(err, result) { assert.equal(err, null); console.log("Result is ===>" + JSON.stringify(result)); if (result.length > 0) { console.log("Count is ===>" + result[0].count); } callback(result); }); }; db.open(function(err, db) { aggregateCheckFields(db, function() { db.close(); }); }); 

输出: –

 Result is ===>[{"_id":null,"count":3}] Count is ===>3