- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我尝试了类似下面的方法,但没有得到预期的结果,如果字段不是数组,这应该可以工作
// 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/
我编写了一个函数来计算两个集合的并集。 我遇到了几个编译错误,我相信这部分是由于我如何制作 StringUnion 数组并声明它,但到目前为止我所做的一切都不起作用。 这是我的头文件。 #ifndef
我在一个集合中有如下文档: { _id : 1 , data : [7,4,0] } { _id : 2 , data : [4,5,6] } { _id : 3 , data : [6,7,8] }
我尝试了类似下面的方法,但没有得到预期的结果,如果字段不是数组,这应该可以工作 // union of includes and excludes as excludesAndExcludes
我是一名优秀的程序员,十分优秀!