Как получить вложенный объект массива с 3 метками в Mongo Query? - PullRequest
0 голосов
/ 24 октября 2018

В основном структура:

{
    "_id" : ObjectId("123123"),
    "stores" : [
        {
            "messages" : [
                {
                    "updated_time" : "2018-05-15T05:12:25+0000",
                    "message_count" : 4,
                    "thread_id" : "123",
                    "messages" : [
                        {
                            "message" : "Hi User ",
                            "created_time" : "2018-05-15T05:12:25+0000",       
                            "message_id" : "111",
                        },
                        {
                            "message" : "This is tes",
                            "created_time" : "2018-05-15T05:12:21+0000",
                            "message_id" : "222",
                        }
                    ]
                },
            ],
            "store_id" : "123"
        }
    ]
}

У меня есть эти значения, чтобы получить объект message_id: 111. Итак, как получить этот объект, любая идея или помощь будут оценены.Спасибо

store_id: 123,
thread_id:123,
message_id:111

1 Ответ

0 голосов
/ 24 октября 2018

Самый простой способ - $ unwind всех вложенных массивов, а затем использовать $ match для получения одного документа.Вы также можете добавить $ replaceRoot , чтобы получить только вложенный документ.Попробуйте:

db.collection.aggregate([
    {  $unwind: "$stores" },
    {  $unwind: "$stores.messages" },
    {  $unwind: "$stores.messages.messages" },
    {  $match: { "stores.store_id": "123", "stores.messages.thread_id": "123", "stores.messages.messages.message_id": "111" } },
    {  $replaceRoot: { newRoot: "$stores.messages.messages" } }
])

Отпечатки:

{
    "created_time": "2018-05-15T05:12:25+0000",
    "message": "Hi User ",
    "message_id": "111"
}

Для повышения производительности вы можете использовать $match после каждого $unwind, чтобы отфильтровать ненужные данные как можно скорее, попробуйте:

db.collection.aggregate([
    {  $unwind: "$stores" },
    {  $match:  { "stores.store_id": "123" } },
    {  $unwind: "$stores.messages" },
    {  $match:  { "stores.messages.thread_id": "123" } },
    {  $unwind: "$stores.messages.messages" },
    {  $match: { "stores.messages.messages.message_id": "111" } },
    {  $replaceRoot: { newRoot: "$stores.messages.messages" } }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...