【问题标题】:MongoDB - Check property occurrence within an arrayMongoDB - 检查数组中的属性出现
【发布时间】:2021-09-27 10:54:13
【问题描述】:

以下是我的文档的示例结构。我必须找到数组中“property1_int”出现次数小于 2 的文档。例如,在 document1 中,“property1_int”出现次数为 2,而在 document2 中,“property1_int”出现次数为 1

    {//document1
    "_id" : NumberLong(1),
    "my_array" : [ 
        {
            "id" : 123,
            "name" : "Alice"
        },
        {
            "id" : 124,
            "name" : "Bob"
        },
        {
            "name" : "John"
        }
    ],
},
{//document2
    "_id" : NumberLong(2),
    "my_array" : [ 
        {
            "id" : 123,
            "name" : "Ana"
        },
        {
            "name" : "James"
        },
        {
            "name" : "Andy"
        }
    ],
}

我试过这个查询 db.collection.find({"my_array.id": $size: {$lt: 2}}) 但它检查单个元素属性大小而不是在数组中出现

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    我会让你在这里查询和我做了什么。

    query

    首先我们展开数组,只剩下包含我们想要的字段的文档。

    然后我们重新对文档进行分组,并仅使用我们想要的信息来修改 my_array 字段。

    最后一步是检查数组中有多少具有目标字段的文档。由于我们已经过滤了我们知道包含它的那些,我们只需要检查有多少。 检查索引 1 是否存在会给我们答案。 例如:

    ["doc1", "doc2", "doc3"]

    这里数组索引1存在,值为“doc2”,所以这个数组至少有2个文档。

    [“doc1”]

    在这种情况下,索引 1 不存在,因此数组必须有 0 或 1 个文档。

    编辑

    要再次获取整个文档,我们需要一些额外的步骤。也许有更好的方法来达到相同的结果,但这就是我所做的。

    query 2

    新增操作说明如下:

    一旦我们在最后一个查询中获得了我们想要的文档,我们就会在集合中搜索它的 id,然后将其存储在一个新的数组字段“all”中。

    我们展开这个数组。

    最后我们把这个字段作为新的根来获得预期的结果。

    【讨论】:

    • 无法理解您的最后一点。它将如何返回该字段少于 2 次的文档?
    • @K142130MuhammadZaidKhan 我更新了最后一点的解释。希望对你有帮助
    • 工作不正常。我只需要出现次数少于 2 的文件,但它也给了我出现次数为 2 或更多的文件。我已经通过 find 查询实现了这个结果,但无法实现小于 2 的条件。
    • 您查看我的查询了吗?这对我来说可以。你在尝试什么?
    • 是的,我看到了,然后在您的查询中写下我的查询。我给出的场景与我原来的场景完全相同,但我在这里给出了示例值。您的查询也给了我 2 次或更多的出现次数。我只需要在文档中包含我的属性出现次数少于 2 的文档
    猜你喜欢
    • 2013-04-07
    • 2018-12-11
    • 2018-03-05
    • 2017-06-21
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多