Как получить объект массива вложенных 3 меток в Mongo Query?

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

{
    "_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
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
1
0
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Самый простой способ - это $ расслабиться для всех вложенных массивов, а затем использовать $ матч для получения одного документа. Вы также можете добавить $ 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" } }
])

Другие вопросы по теме