sql >> Databasteknik >  >> NoSQL >> MongoDB

Flytta ett element från en array till en annan inom samma dokument MongoDB

Det finns ingen $move i MongoDB . Med det sagt, den enklaste lösningen är en 2-fas strategi:

  1. Fråga dokumentet
  2. Skapa uppdateringen med en $pull och $push /$addToSet

Den viktiga delen här, för att se till att allt är idempotent, är att inkludera det ursprungliga arraydokumentet i frågan för uppdateringen.

Givet ett dokument av följande form:

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

Låt säga att du vill flytta { a: 1, b: 1 } till ett annat fält, kanske kallat someOtherArrayField , skulle du vilja göra något liknande.

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

Anledningen till att vi använder $elemMatch är att vara säker på att fältet vi ska ta bort från arrayen inte har ändrats sedan vi först frågade efter dokumentet. I kombination med en $pull det är inte heller absolut nödvändigt, men jag är vanligtvis överdrivet försiktig i dessa situationer. Om det inte finns någon parallellitet i din ansökan, och du bara har en applikationsinstans, är det inte strikt nödvändigt.

När vi nu kontrollerar det resulterande dokumentet får vi:

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



  1. Varför är SQLite snabbare än Redis i detta enkla riktmärke?

  2. Mongo 2.6.1 - Okänt pipeline-stegnamn:'$out'

  3. Använda en objektegenskap som argumentet $maxDistance i en mongodb geolokaliseringsfråga

  4. Kör MongoDB-frågor i Map/Reduce