mongodb 查找查询-在$elemMatch之后按数组大小过滤

qxgroojn  于 2023-01-08  发布在  Go
关注(0)|答案(2)|浏览(134)

在$elemMatch过滤掉数组后,是否可以根据数组的大小返回记录?
例如,如果我在一个集合中有许多记录,如下所示:

[
{
    contents: [
        {
            name: "yorkie",
        },
        {
            name: "dairy milk",
        },
        {
            name: "yorkie",
        },
    ]
},
// ...
]

我想找到所有的记录,其中他们的contents字段包含2个数组项,他们的name字段等于“yorkie”,我该怎么做呢?澄清一下,数组可以包含其他项,但只要其中2个数组项具有匹配的字段:值,就满足条件。
我知道我可以使用$elemMatch(或contents.name)来返回数组中至少包含一个与该名称匹配的项的记录,我也知道我可以使用$size来根据记录字段中数组项的确切数量进行过滤,有没有一种方法可以将它们组合在一起?

wgeznvg7

wgeznvg71#

不在find查询中,但可以通过聚合来完成:

db.test.aggregate([
    { "$match" : { "contents.name" : "yorkie" } },
    { "$unwind" : "$contents" },
    { "$match" : { "contents.name" : "yorkie" } },
    { "$group" : { "_id" : "$_id", "sz" : { "$sum" : 1 } } },    // use $first to include other fields
    { "$match" : { "sz" : { "$gte" : 2 } } }
])

我解释了
只要这些数组项中有2个具有匹配的field:value,则满足条件
这意味着如果至少2个数组项具有name中的匹配值,则满足标准。

xhv8bpkk

xhv8bpkk2#

我知道这个线程很旧,但是今天您可以使用find

db.test.find({
    "$expr": { 
        "$gt": [ 
            { 
                "$reduce": {
                    "input": "$contents",
                    "initialValue": 0,
                    "in": {
                        "$cond": {
                            "if": {
                                "$eq": ["$$this.name", 'yorkie']
                             },
                             "then": {
                                 "$add": ["$$value", 1]
                             },
                             "else": "$$value"
                         }
                     }
                }
            },
            1
        ]
    }
})

reduce函数在这里起作用,它将返回与条件匹配的对象数

相关问题