Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 通过消除具有某些标志的数组对象值,在集合中查找文档_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 通过消除具有某些标志的数组对象值,在集合中查找文档

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'

考虑具有以下文档的集合(下面提到了伪值):

使用node.js和mongoose,我想检索
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));
        });
    }
);