【问题标题】:MongoDb $filter condition to retrieve documents with redundant values in arrayMongoDb $filter 条件以检索数组中具有冗余值的文档
【发布时间】:2021-06-07 00:11:26
【问题描述】:

我有一个 MongoDb 集合,如下所示: 每个文档在“currentVersion”中都有一个“bricks”数组。 现在对于少数 Bricks 数组,有一些多余的砖 id。 我需要检索所有具有冗余积木 ID 的文档。

{ 
    name: "page1", 
    "currentVersion" : {
        "bricks" : [
            {
                "id" : 1.0
            }, 
            {
                "id" : 2.0
            }
        ]
    }
}
{ 
    name: "page2", 
    "currentVersion" : {
        "bricks" : [
            {
                "id" : 13.0
            }, 
            {
                "id" : 13.0
            }
        ]
    }
}
{ 
    name: "page3", 
    "currentVersion" : {
        "bricks" : [
            {
                "id" : 20.0
            }, 
            {
                "id" : 30.0
            }
        ]
    }
}
{ 
    "name" : "page4", 
    "currentVersion" : { 
        "bricks" : [
            {
                "id" : 50.0
            }, 
            {
                "id" : 50.0
            }, 
            {
                "id" : 70.0
            }
        ]
    }
}

我的方法如下:

  • 我正在创建两个数组 - 'origValuesSize' 和 'allValuesSize'
  • 如果这两个值不相等,那么就是有冗余值的文档

您能否建议我如何根据上述条件过滤文档。 在下面的代码中需要帮助

db.pages.find({},db.aggregate(
   [
     { $project: {
          origValuesSize: { $size: {$concatArrays : [ "$currentVersion.bricks.id" ]} },
          allValuesSize: {$size: {$setUnion : [ "$currentVersion.bricks.id" ]}},
          $filter: -->  Need Help Here to compare the above two sizes and filter accordingly                               
      }}
   ]
))
  • 编辑:1

我的预期结果如下: 我只需要在“砖块”数组中显示那些具有冗余砖块 ID 的文档。

{ 
    name: "page2", 
    "currentVersion" : {
        "bricks" : [
            {
                "id" : 13.0
            }, 
            {
                "id" : 13.0
            }
        ]
    }
}
{ 
    "name" : "page4", 
    "currentVersion" : { 
        "bricks" : [
            {
                "id" : 50.0
            }, 
            {
                "id" : 50.0
            }, 
            {
                "id" : 70.0
            }
        ]
    }
}

提前致谢,

【问题讨论】:

  • 你能展示你的预期结果吗?这两点都不清楚,请您解释一下。
  • 我已经添加了预期的结果。实际上我正在尝试使用聚合的一种方法。 db.pages.find({},db.aggregate( .. ) ,我在其中获取两个砖块 ID 数组 - 一个使用 $setUnion,另一个使用 $concatArrays,我的逻辑是比较这两个数组的大小。如果这两个 Arrays 长度不相等,则该文档包含多余的 Brick Ids,我需要显示

标签: mongodb aggregation-framework


【解决方案1】:

您可以在匹配阶段将表达式与聚合运算符一起使用,

  • $size 获取 currentVersion.bricks 中的总元素
  • $setUnion 获得currentVersion.bricks.id 中的总 uniue ids,$size 获得总元素
  • $ne 匹配两个大小不应该相同
db.pages.aggregate([
  {
    $match: {
      $expr: {
        $ne: [
          { $size: "$currentVersion.bricks" },
          { $size: { $setUnion: "$currentVersion.bricks.id" } }
        ]
      }
    }
  }
])

Playground


MongoDB +3.2,

  • $project 显示必填字段
  • 获取两者的大小并匹配$eq条件,如果两者相同则返回true,否则返回false
  • $match isEqual 为假
db.pages.aggregate([
  {
    $project: {
      name: 1,
      currentVersion: 1,
      isEqual: {
        $eq: [
          { $size: "$currentVersion.bricks" },
          { $size: { $setUnion: "$currentVersion.bricks.id" } }
        ]
      }
    }
  },
  { $match: { isEqual: false } }
])

Playground

【讨论】:

  • 我在我的个人笔记本电脑上测试了这个。这是有效的。我的 Mongo 版本是 4.2.2。但是当我在我的办公室笔记本电脑上测试这个时,我收到一个错误“Unknown top level operator $expr”。我在工作中使用 Mongo 3.2.2 版。您能否建议 3.2.2 中的替代方案?
  • 检查添加的选项,我不确定新选项是否有效。
  • 我收到一个错误“$size 的参数必须是一个数组,但类型为:EOO”。这可能是因为我们的文档很少有“砖”数组为空(或不存在)。我们可以事先检查文档是否包含“砖”数组,然后进行比较吗?喜欢使用 $isExists 等?
  • 你所说的“砖块”是什么意思?它的 null 或空对象 {},或空数组 [],或字段不存在?
猜你喜欢
  • 2021-08-20
  • 1970-01-01
  • 2016-12-29
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
相关资源
最近更新 更多