sql >> Databáze >  >> NoSQL >> MongoDB

Přesuňte prvek z jednoho pole do druhého v rámci stejného dokumentu MongoDB

Neexistuje žádný $move v MongoDB . Jak již bylo řečeno, nejjednodušším řešením je dvoufázový přístup:

  1. Zeptejte se na dokument
  2. Vytvořte aktualizaci pomocí $pull a $push /$addToSet

Důležitou součástí, aby bylo zajištěno, že je vše idempotentní, je zahrnout původní dokument pole do dotazu na aktualizaci.

Předán dokument v následující podobě:

{
    _id: "foo",
    arrayField: [
        {
            a: 1,
            b: 1
        },
        {
            a: 2,
            b: 1
        }
    ]
}

Řekněme, že chcete přesunout { a: 1, b: 1 } do jiného pole, možná nazvaného someOtherArrayField , chtěli byste udělat něco jako.

var doc = db.col.findOne({_id: "foo"});
var arrayDocToMove = doc.arrayField[0];
db.col.update({_id: "foo", arrayField: { $elemMatch: arrayDocToMove} }, { $pull: { arrayField: arrayDocToMove }, $addToSet: { someOtherArrayField: arrayDocToMove } })

Důvod, proč používáme $elemMatch je ujistit se, že pole, které se chystáme odstranit z pole, se nezměnilo od doby, kdy jsme poprvé dotazovali dokument. Ve spojení s $pull také to není nezbytně nutné, ale v těchto situacích jsem obvykle příliš opatrný. Pokud ve vaší aplikaci není paralelismus a máte pouze jednu instanci aplikace, není to nezbytně nutné.

Nyní, když zkontrolujeme výsledný dokument, dostaneme:

db.col.findOne()
{
        "_id" : "foo",
        "arrayField" : [
                {
                        "a" : 2,
                        "b" : 1
                }
        ],
        "someOtherArrayField" : [
                {
                        "a" : 1,
                        "b" : 1
                }
        ]
}



  1. Asynchronní middleware Mongoose pre.save() nefunguje podle očekávání

  2. Seřaďte pole v dokumentu pomocí MongoDB

  3. Meteor `Deps.autorun` vs `Collection.observe`

  4. Jak se připojit k vašim MongoDB nasazením pomocí Robo 3T GUI