MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Przenieś element z jednej tablicy do drugiej w tym samym dokumencie MongoDB

Nie ma $move w MongoDB . Biorąc to pod uwagę, najłatwiejszym rozwiązaniem jest podejście dwufazowe:

  1. Zapytaj o dokument
  2. Utwórz aktualizację za pomocą $pull i $push /$addToSet

Ważną częścią tutaj, aby upewnić się, że wszystko jest idempotentne, jest uwzględnienie oryginalnego dokumentu tablicy w zapytaniu o aktualizację.

Otrzymano dokument w następującej formie:

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

Powiedzmy, że chcesz przenieść { a: 1, b: 1 } do innego pola, być może o nazwie someOtherArrayField , chciałbyś zrobić coś takiego.

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

Powód, dla którego używamy $elemMatch jest upewnienie się, że pole, które zamierzamy usunąć z tablicy, nie zmieniło się od czasu, gdy po raz pierwszy przeszukaliśmy dokument. W połączeniu z $pull nie jest to również absolutnie konieczne, ale zazwyczaj jestem zbyt ostrożny w takich sytuacjach. Jeśli w Twojej aplikacji nie ma paralelizmu, a masz tylko jedną instancję aplikacji, nie jest to absolutnie konieczne.

Teraz, gdy sprawdzamy wynikowy dokument, otrzymujemy:

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak używać wyrazistego mangusty, pomijać i ograniczać razem?

  2. MongoDB — maksymalny rozmiar pliku przy użyciu GridFS

  3. junit przypadki testowe przy użyciu osadzania mongodb de.flapdoodle.embed.mongo

  4. MongoDB i duże zbiory danych przy użyciu wzorca repozytorium

  5. Zmień kształt wszystkich dokumentów w kolekcji