Поля массива фильтра MongoDB в каждом документе коллекции - PullRequest
1 голос
/ 22 марта 2019

У меня есть 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.В этом поле у ​​меня есть список полей словаря (0, 1, 2 ...).Я хочу отфильтровать все документы, где в каждом поле conversations значение message равно Message 4.

Мне известен способ фильтрации по определенному полю в каждом документе * 1016.*, но я не знаю, как применить его к списку полей словаря, как в моем случае.Любая помощь?

1 Ответ

1 голос
/ 22 марта 2019

Вам нужен оператор $ objectToArray , чтобы превратить объект с неизвестными ключами в массив полей k и v. Затем внутри $ 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
                ]
            }
        }
    }
])

Пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...