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);
然后,您的服务返回的所有内容都是字符串数组,没有嵌入结构
[
“早餐”
“机场接送”
“晚餐”
“住宿”
]