Mam następującą strukturę mojego dokumentu:

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

Chciałbym przeciągnąć dokument do „ogólnej” tablicy według jego „_id”.

Próbowałem kilku rzeczy, ale wydaje mi się, że nic nie działa.

Każda pomoc będzie doceniona :)

0
NilsKyuubi 19 marzec 2020, 09:29

2 odpowiedzi

Najlepsza odpowiedź

Zapytanie aktualizujące, aby pobrać dokument podrzędny z pola zagnieżdżonej tablicy general przy użyciu _id:

ID = "5e728265f4796c0017203662"

db.collection.update(
 { "daily.general._id": ID },
 { $pull: { "daily.$.general": { _id: ID } } }
)
2
prasad_ 19 marzec 2020, 07:28

Można to zrobić tylko w Mongo 4.2+, gdzie wprowadzono aktualizacje potoku.

Teraz możemy użyć wyrażeń agregacji do aktualizacji dokumentów:

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

Lub jeśli codzienne obiekty mają więcej niż tylko ogólne pole, możesz to zrobić w ten sposób:

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"]}
                                        }
                                    }
                                }
                            ]
                        }
                    }
                }
            }
        }
    ]);

Niestety dla żadnej innej wersji Mongo nie jest to możliwe, będziesz musiał zrestrukturyzować swoje dane lub zrobić to w kodzie.

0
Tom Slabbaert 19 marzec 2020, 07:48