Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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 如何使用$setUnion和$group从mongoose获得唯一的结果?_Node.js_Mongodb_Mongoose_Mongodb Query_Aggregation Framework - Fatal编程技术网

Node.js 如何使用$setUnion和$group从mongoose获得唯一的结果?

Node.js 如何使用$setUnion和$group从mongoose获得唯一的结果?,node.js,mongodb,mongoose,mongodb-query,aggregation-framework,Node.js,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,我尝试了下面的方法,但是没有得到预期的结果,如果字段不是数组,这应该可以工作 // union of includes and excludes as excludesAndExcludes getIncludesAndExcludes: (req, res)=>{ console.log('called setunion'); experienceModel.aggregate([ { $group: {_id : {in

我尝试了下面的方法,但是没有得到预期的结果,如果字段不是数组,这应该可以工作

 // union of includes and excludes as excludesAndExcludes
    getIncludesAndExcludes: (req, res)=>{
        console.log('called setunion');
        experienceModel.aggregate([
            { $group: {_id : {includes:"$includes", excludes:"$excludes"}}},            
            { $project: { includesAndExcludes: { $setUnion: [ "$_id.includes", "$_id.excludes" ] }, _id:0 } }  
        ], (err, data) => {
            if (err) {
                res.status(500).send(error); 
            } else {
                res.json(data);
            }         
        })
    },

如果两个数组都没有任何元素,则最有效地排除文档,最重要的是,您需要在不存在数组的情况下使用
null

experienceModel.aggregate([
//不要包含没有数组的文档
{“$match”:{
“$or”:[
{“includes.0”:{“$exists”:true},
{“excludes.0”:{“$exists”:true}
]
},
//加入数组并排除空值
{“$project”:{
“_id”:0,
“名单”:{
“$setDifference”:[
{“$setUnion”:[
{“$ifNull”:[“$includes”,[null]]},
{“$ifNull”:[“$excludes”,[null]]}
]},
[零]
]
}},
//根据先前的条件,数组必须有一些条目
{“$unwind”:“$list”},
//列表中的$group值作为产生不同结果的键
{“$group”:{“\u id”:“$list”}
],(错误,数据)=>{
//代码的其余部分
})
因此,首先要进行筛选,以便至少有一个数组必须作为逻辑规则存在,这也可能会加快速度。接下来,将数组与合并,小心地替换为单个元素的数组
[null]
如果字段不存在,则使用。如果未执行此操作,则任何结果都将为
null
,而不是列出任何一个数组的条目。因此,这非常重要

由于的输出可能在其列表中有一个
null
项,因此您可以使用删除该项,这是您可以编写的最短形式的过滤器,可以很好地使用“集合”

真正剩下的就是使用[
$unwind][6]
将每个文档中的数组“反规范化”为每个元素的单个文档,我们不需要像
preserveNullAndEmptyArrays
这样的新选项,因为上面的所有逻辑已经解决了这个问题。然后,只需对这些值进行最终处理,就可以生成“唯一”输出,即语句中的
\u id
键的用途

如果需要,您甚至可以使用以下命令将聚合结果拆分为响应的简单字符串列表:

data=data.map(d=>d.\u id);
然后,您的服务返回的所有内容都是字符串数组,没有嵌入结构

[
“早餐”
“机场接送”
“晚餐”
“住宿”
]

如果两个数组都没有任何元素,则最有效地排除文档,最重要的是,您需要在不存在数组的情况下使用
null
替换

experienceModel.aggregate([
//不要包含没有数组的文档
{“$match”:{
“$or”:[
{“includes.0”:{“$exists”:true},
{“excludes.0”:{“$exists”:true}
]
},
//加入数组并排除空值
{“$project”:{
“_id”:0,
“名单”:{
“$setDifference”:[
{“$setUnion”:[
{“$ifNull”:[“$includes”,[null]]},
{“$ifNull”:[“$excludes”,[null]]}
]},
[零]
]
}},
//根据先前的条件,数组必须有一些条目
{“$unwind”:“$list”},
//列表中的$group值作为产生不同结果的键
{“$group”:{“\u id”:“$list”}
],(错误,数据)=>{
//代码的其余部分
})
因此,首先要进行筛选,以便至少有一个数组必须作为逻辑规则存在,这也可能会加快速度。接下来,将数组与合并,小心地替换为单个元素的数组
[null]
如果字段不存在,则使用。如果未执行此操作,则任何结果都将为
null
,而不是列出任何一个数组的条目。因此,这非常重要

由于的输出可能在其列表中有一个
null
项,因此您可以使用删除该项,这是您可以编写的最短形式的过滤器,可以很好地使用“集合”

真正剩下的就是使用[
$unwind][6]
将每个文档中的数组“反规范化”为每个元素的单个文档,我们不需要像
preserveNullAndEmptyArrays
这样的新选项,因为上面的所有逻辑都已经解决了这个问题。然后,只需对这些值进行最终处理即可生成““唯一”输出,即语句中的
\u id
键的用途

如果需要,您甚至可以使用以下命令将聚合结果拆分为响应的简单字符串列表:

data=data.map(d=>d.\u id);
然后,您的服务返回的所有内容都是字符串数组,没有嵌入结构

[
“早餐”
“机场接送”
“晚餐”
“住宿”
]