Node.js 通过消除具有某些标志的数组对象值,在集合中查找文档
考虑具有以下文档的集合(下面提到了伪值): 使用node.js和mongoose,我想检索Node.js 通过消除具有某些标志的数组对象值,在集合中查找文档,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,考虑具有以下文档的集合(下面提到了伪值): 使用node.js和mongoose,我想检索xyz公司的详细信息,但是“empDet”的值应该只有包含disableFlag的值为true。例如,我期望的输出应该是: { id: "002", company: "xyz", empDet: [ { disableFlag: true, name: 'ravi', age: 45, designation: 'consultant'
xyz
公司的详细信息,但是“empDet”
的值应该只有包含disableFlag
的值为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的数组对象值来查找或检索集合中的文档?在这种情况下,中的管道操作符应该适用于您。这将递归地向下遍历文档结构,并根据对每个级别的指定条件的评估执行一些操作。这个概念可能有点难理解,但下面的示例演示了这一点:
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));
});
}
);
您应该向模型中添加一个新属性,或者您在该状态下签入查询结果。非常感谢您的回复。但是我忘了提到empDet(嵌入式)中还有一个类似emp_id的字段,它将是字符串,并且引用另一个集合。因此,我还必须填充属于xyz公司的员工的员工详细信息(根据emp_id加入集合)以及前面查询中提到的其他值(应该只有包含disableFlag的值为true)。很抱歉之前没有提到。(应该同时使用“填充”和“聚合”,我如何实现这一点?)感谢您的帮助,我能够同时使用“聚合”和“填充”。我得到了所需的输出。Model.aggregate([{“$match”:{“company”:“xyz”},{“$redact”:{“$cond”:{“if”:{“$eq”:[“$disableFlag”,false]}”,然后是“$$PRUNE”,“else”:“$$down”}])。exec(函数(err,results){Model.populate(results,{path:'empDet.emp_id'},函数(error,op){console.log(op);});});不用担心。我已经用一些东西更新了我的答案,这些东西应该会让你朝着正确的方向前进,因为我不知道你的db模式是什么样的。但是概念是对基础结果调用populate方法,如果丢失了链接文档,应该会有所帮助。我是stackoverflow.com的新用户,我试图接受你的解决方案,但只是在赢得15个声誉我的投票将改变公开显示的帖子分数。但是你的回复真的很有帮助。谢谢Chridam
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));
});
}
);