集合的每个文档中的MongoDB过滤器数组字段

时间:2019-03-22 20:42:04

标签: mongodb aggregation-framework

我有一个MongoDB collection,其结构如下:

/* 1 */
{
    "_id" : ObjectId("5c09a454dd42360001fd2515"),
    "conversations" : {
        "0" : {
            "message" : "Message 1",
              .
              .
              .
        },
        "1" : {
            "message" : "Message 1"
               .
               .
               .
        },
        "2" : {
            "message" : "Message 5"
              .
              .
              .
        },
        "3" : {
            "message" : "Message 1"
              .
              .
              .
        },
        "4" : {
            "message" : "Message 2"
              .
              .
              .
        },
        "5" : {
            "message" : "Message 3"

        },
        "6" : {
            "message" : "compliance"

        },
        "7" : {
            "message" : "Google"

        }
}

/* 2 */
{
    "_id" : ObjectId("5c09a673c2a98f00012f4efb"),

    "conversations" : {
        "0" : {
            "message" : "Message 11"

        },
        "1" : {
            "message" : "Google",

        },
        "2" : {
            "message" : "Message 7"

        }
}

/* 3 */
{
    "_id" : ObjectId("5c09f570173f7900015a82b2"),

    "conversations" : {
        "0" : {
            "message" : "Message 4"
        },

}

.
.
.

在上面的示例数据中,我在collection内有一组文档,并且在每个文档中都有一个名为conversations的字典字段数组。在此字段中,我具有词典字段的列表(012 ...)。我想做的是过滤所有conversations字段中message值为Message 4的所有文档。

我知道过滤到每个文档中特定字段的方法是db.getCollection('collection_1').find({conversation:""}),但是我不知道如何将其应用于字典字段列表,例如我的案例。有帮助吗?

1 个答案:

答案 0 :(得分:1)

您需要$objectToArray运算符才能将具有未知键的对象转换为kv字段的数组。然后,可以在$expr内对该数组应用$filter来检查是否有任何message等于"Message 4"

db.collection.aggregate([
    {
        $match: {
            $expr: {
                $ne: [
                    {
                        $size: {
                            $filter: {
                                input: { $objectToArray: "$conversations" },
                                as: "conv",
                                cond: { $eq: [ "$$conv.v.message", "Message 4" ] }
                            }
                        }
                    },
                    0
                ]
            }
        }
    }
])

Example