如何解决使用条件减少mongodb聚合
我有一组具有不同属性的称为“额外”的对象:有些对象具有“加号”,有些则没有。 我想在这个“额外”数组中创建两个不同的数组,一个称为“cheap”,其中包含所有没有“plus”属性的对象,另一个称为“exp”,其中只包含具有“plus”属性的对象。 我想我可以在带有 $concatArrays 的 mongodb 聚合中使用 $reduce 方法,并使用 $cond 检查属性 plus 是否存在。 类似的东西:
数据示例:
{
extra: [
{
description: "laces",type: "exterior",plus: '200'
},{
description: "sole",type: "interior"
},{
description: "logo",type: "exterior"
},{
description: "stud",plus: '450'
}
],}
{
$project: {
extra: {
$reduce: {
input: ['$extra'],initialValue: {cheap: [],exp: []},$cond: {
if: {$eq: ['$$this.plus',null]},then: {
in: {
cheap: {
$concatArrays: ['$$value.cheap','$$this'],},else: {
in: {
exp: {
$concatArrays: ['$$value.exp',}
它不起作用......我尝试了很多方法,或者没有运气就写了 $cond 部分。 我想不通。 谢谢你们。 K.
解决方法
除了一些小的语法问题之外,您还遇到了另一个问题,那就是您对 $ne
运算符的理解。
在这种情况下,您希望缺失值等于 null
,这不是 Mongo 的工作方式。所以对于文档:
{ name: "my name" }
聚合查询:
{ $cond: { $eq: ["$missingField",null] } }
不会像您期望的那样给出 true,因为缺失不等于 null
。我冒昧地解决了您遇到的语法问题,这条工作管道是您要走的路:
db.collection.aggregate([
{
$project: {
extra: {
$reduce: {
input: "$extra",initialValue: {
cheap: [],exp: []
},in: {
cheap: {
"$concatArrays": [
"$$value.cheap",{
$cond: [
"$$this.plus",[],[
"$$this"
],]
}
]
},exp: {
"$concatArrays": [
"$$value.exp",[]
]
}
]
}
}
},},}
])
需要注意的一点是 $cond
计算 plus
字段,这意味着如果该字段确实存在带有 null
值或 0
值,那么它会考虑这个与 cheap
数组匹配的文档。如果可能,这是需要考虑和改变的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。