通过消除具有某个标志的数组对象值来查找集合中的文档

考虑一个包含文档的集合(下面将提到虚拟值):

{ id: "001", company: "abc", empDet: [ { disableFlag: true, name: 'raj', age: 45, designation: 'clerk' }, { disableFlag: false, name: 'ramya', age: 35, designation: 'manager' }, { disableFlag: false, name: 'gabriel', age: 41, designation: 'asstManager' }, { disableFlag: true, name: 'saran', age: 55, designation: 'attender' }, { disableFlag: true, name: 'buela', age: 25, designation: 'cashier' } ], location: "delhi" }, { id: "002", company: "xyz", empDet: [ { disableFlag: true, name: 'ravi', age: 45, designation: 'consultant' }, { disableFlag: true, name: 'reka', age: 35, designation: 'manager' }, { disableFlag: false, name: 'geetha', age: 41, designation: 'asstManager' }, { disableFlag: false, name: 'varun', age: 55, designation: 'attender' }, { disableFlag: true, name: 'balu', age: 25, designation: 'clerk' } ], location: "mumbai" }, { id: "003", company: "pqr", empDet: [ { disableFlag: true, name: 'bobby', age: 45, designation: 'consultant' }, { disableFlag: true, name: 'vinay', age: 35, designation: 'manager' }, { disableFlag: true, name: 'faritha', age: 41, designation: 'asstManager' }, { disableFlag: false, name: 'arun', age: 55, designation: 'attender' }, { disableFlag: true, name: 'kayal', age: 25, designation: 'clerk' }, ], location: "calcutta" } 

使用node.js和mongoose,我想检索xyz公司的详细信息,但是"empDet"的值应该只有包含"empDet"值为true。 例如,我期待的输出应该是:

 { id: "002", company: "xyz", empDet: [ { disableFlag: true, name: 'ravi', age: 45, designation: 'consultant' }, { disableFlag: true, name: 'reka', age: 35, designation: 'manager' }, { disableFlag: true, name: 'balu', age: 25, designation: 'clerk' } ], location: "mumbai" } 

如何通过使用node.js和mongoose消除一些标志为false的数组对象值来在集合中查找或检索文档?

在这种情况下, 汇总框架中$redactpipe道运算符应该适合您。 这将通过文档结构recursion下降,并根据对每个级别指定条件的评估来执行一些操作。 这个概念可能有点棘手,但下面的例子certificate了这一点:

 Model.aggregate([ { "$match": { "company" : "xyz" } }, { "$redact": { "$cond": { "if": { "$eq": [ "$disableFlag", false ] }, "then": "$$PRUNE", "else": "$$DESCEND" } } } ]).exec(function (err, results){ // handle error console.log(results); }); 

示例输出:

 /* 0 */ { "result" : [ { "_id" : ObjectId("562e1398bf03613b4ad1b541"), "id" : "002", "company" : "xyz", "empDet" : [ { "disableFlag" : true, "name" : "ravi", "age" : 45, "designation" : "consultant" }, { "disableFlag" : true, "name" : "reka", "age" : 35, "designation" : "manager" }, { "disableFlag" : true, "name" : "balu", "age" : 25, "designation" : "clerk" } ], "location" : "mumbai" } ], "ok" : 1 } 

更新 – 如果你想填充属于xyz公司的员工的员工详细信息,你可以使用最新版本的mongoose来填充 ,这个版本能够递增地在已经添加的查询中填充相关文档。 但是这需要第二个查询,并使用不同的填充方式:

 var pipeline = [ { "$match": { "company" : "xyz" } }, { "$redact": { "$cond": { "if": { "$eq": [ "$disableFlag", false ] }, "then": "$$PRUNE", "else": "$$DESCEND" } } } ]; Model.aggregate(pipeline, function(err, results) { if (err) throw err; Model.populate(results, {"path": "empDet.emp_id"}, function(err, results) { if (err) throw err; console.log(JSON.stringify(results, undefined, 4)); }); } );