sql >> Database >  >> NoSQL >> MongoDB

Verplaats een element van de ene array naar de andere binnen hetzelfde document MongoDB

Er is geen $move in MongoDB . Dat gezegd hebbende, de gemakkelijkste oplossing is een aanpak in twee fasen:

  1. Bezoek het document
  2. Maak de update met een $pull en $push /$addToSet

Het belangrijkste onderdeel hier, om ervoor te zorgen dat alles idempotent is, is om het originele arraydocument op te nemen in de query voor de update.

Gegeven een document van de volgende vorm:

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

Stel dat u { a: 1, b: 1 } . wilt verplaatsen naar een ander veld, misschien genaamd someOtherArrayField , zou je zoiets willen doen.

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 } })

De reden waarom we de $elemMatch gebruiken is om er zeker van te zijn dat het veld dat we gaan verwijderen uit de array niet is veranderd sinds we het document voor het eerst hebben opgevraagd. In combinatie met een $pull het is ook niet strikt noodzakelijk, maar ik ben meestal overdreven voorzichtig in deze situaties. Als er geen parallellisme is in uw toepassing en u slechts één toepassingsinstantie heeft, is dit niet strikt noodzakelijk.

Als we nu het resulterende document controleren, krijgen we:

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



  1. Mongoose verbinding

  2. MongoDB-aggregatie gebruiken voor setbewerkingen voor algemene doeleinden (vereniging, kruising, verschil)

  3. tel het aantal sessies in connect-redis

  4. Willekeurige sorteervolgorde