【问题标题】:match operation for array size gt 0 does not work in aggregation MongoDB数组大小 gt 0 的匹配操作在聚合 MongoDB 中不起作用
【发布时间】:2020-03-10 17:43:17
【问题描述】:

我有一个名为 Book 的 mongo 集合。

{
    "_id" : "00000000",
    "name" : "Book1",
    "similarBooks" : [],
    "genre" : ""
}

similarBooks 是 Book 集合中的一个数组,其中包含与 Book1 相似的其他书籍。

我想找到与它有相似书籍的所有书籍。这意味着我需要在我的聚合中匹配similarBooks 数组大小 gt 0。

我正在使用聚合-

db.Book.aggregate([{
            "$match": {
                "similarBooks": {
                    "$gt": {
                        "$size": 0
                    }
                }
            }
        }
    ])

但它不起作用。 在匹配条件中使用 $expr 还有另一种选择,

db.Book.aggregate([{ {
            $match: {
                $expr: {
                    $gt: [{
                            $size: "$similarBooks"
                        }, 0]
                }
            }
        }
    ])

但是我们不能在创建部分索引时使用 $expr,所以我不能在我的聚合中使用第二个使用 $expr 的选项。有没有其他方法可以运行聚合以找到数组大小 gt 0。

我正在使用 MongoDB shell 版本 v4.2.3。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    您可以将 Mongo 的 dot notation$exists 结合使用。

    db.Book.aggregate(
        [
            {
                "$match": {
                    "similarBooks.0": {"$exists": true}
                }
            }
        ])
    

    【讨论】:

    • 我想避免使用空值 ([]) 的数组。 {"$exists": true} 不会这样做
    • 会的,你试过了吗?
    • 我错了,聚合有效。谢谢您,但是如何使用此匹配条件创建部分索引。我试过 db.Book.createIndex({similarBooks: 1 }, { partialFilterExpression: { "similarBooks.0": { "$exists": true } } }) 并且我的聚合没有使用部分索引
    猜你喜欢
    • 2020-11-02
    • 2018-07-28
    • 2023-03-17
    • 1970-01-01
    • 2023-01-22
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多