gpt4 book ai didi

node.js - 如何使用 $setUnion 和 $group 从 mongoose 获得独特的结果?

转载 作者:太空宇宙 更新时间:2023-11-04 02:05:57 25 4
gpt4 key购买 nike

sample documents of mongodb

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

 // 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);
}
})
},

最佳答案

如果两个数组都没有任何元素,则通过 $exists 最有效地排除文档最重要的是你将需要 $ifNull当数组不存在时用 null 替换。

experienceModel.aggregate([
// Don't include documents that have no arrays
{ "$match": {
"$or": [
{ "includes.0": { "$exists": true } },
{ "excludes.0": { "$exists": true } }
]
},
// Join the arrays and exclude the nulls
{ "$project": {
"_id": 0,
"list": {
"$setDifference": [
{ "$setUnion": [
{ "$ifNull": [ "$includes", [null] ] },
{ "$ifNull": [ "$excludes", [null] ] }
]},
[null]
]
}},

// Unwind. By earlier conditions the array must have some entries
{ "$unwind": "$list" },

// And $group on the list values as the key to produce distinct results
{ "$group": { "_id": "$list" }
],(err, data) => {
// rest of code
})

所以第一个$match是进行过滤,以便至少必须存在一个数组作为逻辑规则,这也可能加快速度。接下来,使用 $setUnion 连接数组,小心地使用 $ifNull 替换为单个元素 [null] 的数组如果该字段不存在。如果您没有这样做,那么任何$setUnion结果将为 null 而不是列出任一数组的条目。所以这非常重要。

因为可以输出 $setUnion要在列表中包含 null 项,您可以使用 $setDifference 删除它,这是您可以编写的最短形式的过滤器,并且可以与“集合”配合使用。

真正剩下的就是使用 [$unwind][6] 将每个文档中的数组“去规范化”为每个元素的单个文档,并且我们不需要像 preserveNullAndEmptyArrays 这样的新选项,因为上面的所有逻辑已经处理了这个问题。然后是最后的$group只需对这些值进行操作即可产生“唯一”输出,这就是 $group 中的 _id 键。声明是为了。

如果您愿意,您甚至可以使用 .map() 将聚合结果剥离为简单的字符串列表以供您的响应:

data = data.map( d => d._id );

那么您的服务返回的只是一个字符串数组,没有嵌入的结构。

[
"Breakfast"
"Airport Pickup"
"Dinner"
"Accomodation"
]

关于node.js - 如何使用 $setUnion 和 $group 从 mongoose 获得独特的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44336731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com