Mon go DB Удалить поле в массиве внутри массива - PullRequest
0 голосов
/ 19 марта 2020

У меня следующая структура моего документа:

{
    "daily": [
        {
            "general": [
                {
                    "status": false,
                    "_id": "5e728265f4796c0017203662",
                    "title": "Sport"
                },...
            ]
        }
    ]
}

Я бы хотел вытащить документ из «общего» массива на «_id».

Я пробовал несколько вещей, но мне кажется, что ничего не работает.

Буду признателен за любую помощь :)

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Запрос на обновление для извлечения вложенного документа из поля вложенного массива general с использованием _id:

ID = "5e728265f4796c0017203662"

db.collection.update(
 { "daily.general._id": ID },
 { $pull: { "daily.$.general": { _id: ID } } }
)
0 голосов
/ 19 марта 2020

Это можно сделать только в понедельник go 4.2+, где они представили pipe'd обновления .

Теперь мы можем использовать выражения агрегации для обновления документов:

db.collection.updateOne(
    {},
    [
        {
            $set: {
                "daily": {
                    $map: {
                        input: "$daily",
                        as: "item",
                        in: {
                            "general": {
                                $filter: {
                                    input: "$$item.general",
                                    as: "datum",
                                    cond: {$ne: ["$$datum._id", "5e728265f4796c0017203662"]}
                                }
                            }
                        }
                    }
                }
            }
        }
    ]);

Или, если у ежедневных объектов есть больше, чем просто общее поле, вы можете сделать это следующим образом:

db.collection.updateOne(
    {},
    [
        {
            $set: {
                "daily": {
                    $map: {
                        input: "$daily",
                        as: "item",
                        in: {
                            $mergeObjects: [
                                "$$item",
                                {
                                    "general": {
                                        $filter: {
                                            input: "$$item.general",
                                            as: "datum",
                                            cond: {$ne: ["$$datum._id", "5e728265f4796c0017203662"]}
                                        }
                                    }
                                }
                            ]
                        }
                    }
                }
            }
        }
    ]);

К сожалению, для любой другой версии Mon go это невозможно, вы придется реструктурировать ваши данные или сделать это в коде.

...