【问题标题】:Mongodb how to find docs with more than 2 array items with specific valueMongodb如何查找具有超过2个具有特定值的数组项的文档
【发布时间】:2019-10-11 07:26:42
【问题描述】:

有人可以告诉我如何在 Mongodb 数组中查找包含超过 2 个具有特定值的项目的项目吗?例如,如果我有两个这样的文件:

{
    someArray: [
        {'aaa' => 1},
        {'aaa' => 1}
    ]
}
{
    someArray: [
        {'aaa' => 1},
        {'aaa' => 2}
    ]
}

我需要找到第一个包含 'aaa' 值为 1 的两个项目的文档。我不是说 $elemMatch 我需要计算匹配项的数量。 感谢您的帮助。

【问题讨论】:

  • 你能显示示例输出吗
  • 我不明白。输出应该是文档。对我而言,_id 就足够了。

标签: arrays mongodb find aggregation-framework


【解决方案1】:

您可以使用$indexOfArray 查找数组是否包含该元素,然后使用$eq 与数组的$size 进行比较

db.collection.find({
  "$expr": {
    "$and": [
      { "$ne": [{ "$indexOfArray": ["$someArray.aaa", 1] }, -1] },
      { "$eq": [{ "$size": "$someArray" }, 2] }
    ]
  }
}).limit(1)

MongoPlayground

【讨论】:

  • 这里都是关于解释的,实际上意味着“'aaa'值为1的两个项目”,在这种情况下,其中任何一个都必须将aaa设置为1,我'我不确定这是否是重点
  • :-):-):-) 是的。甚至我现在也很困惑。我认为可能是任何元素包含值1。但我认为你是对的,这两个元素都应该包含1。让我们看看OP需要什么。很可能你是对的。
【解决方案2】:

您可以使用以下聚合:

db.col.aggregate([
    {
        $match: {
            $expr: {
                $gte: [
                    { $size: { $filter: { input: "$someArray", cond: { $eq: [ "$$this.aaa", 1 ] } } } },
                    2
                ]
            }
        }
    },
    {
        $limit: 1
    }
])

$filter 允许您应用您的条件,然后您可以使用$size 来获取过滤数组的长度并使用$gte 将其与您的值进行比较

【讨论】:

    猜你喜欢
    • 2016-06-18
    • 2015-02-13
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 2015-04-29
    • 2014-12-11
    相关资源
    最近更新 更多