2016-03-20 3 views
1

Ich speichere in einer Sammlung ein Array von Elementen (stringId). Alle Elemente in diesem Array müssen eindeutig sein. Also benutze ich $ addToSet, um meinen Gegenstand zu schieben.Fügen Sie Unique nur dem Array hinzu und behalten Sie die Anzahl der Felder bei der Aktualisierung.

Aber ich mag auch in einem Feld in der gleichen Anfrage die Größe meiner Array setzen:

{ 
    unique_array: ['12', '20', '18'], 
    size_of_array: 3 
} 

=> In 15

{ 
    unique_array: ['12', '20', '18', '15'], => Add to set 
    size_of_array: 4 => Incremented 
} 

=> einzustellen hinzufügen einstellen 18

{ 
    unique_array: ['12', '20', '18', '15'], => Already in the set 
    size_of_array: 4 => Not incremented 
} 

Vielen Dank!

Antwort

2

Für diese Art der Operation, die Sie $addToSet nicht seit der war natürlich die $inc passieren würde, unabhängig davon, ob irgendetwas auf das Array („set“) oder nicht hinzugefügt verwenden sollten.

Stattdessen testen die Arrays mit dem $ne Operator in der Abfrage:

db.collection.update(
    { "unique_array": { "$ne": 18 } }, <-- existing element 
    { 
     "$push": { "unique_array": 18 }, 
     "$inc": { "size_of_array": 1 } 
    } 
) 

Das gleiche gilt für die Array-Mitglieder zu entfernen, aber natürlich dieses Mal sind Sie für die Präsenz mit Gleichheit testen:

db.collection.update(
    { "unique_array": 18 }, <-- existing element 
    { 
     "$pull": { "unique_array": 18 }, 
     "$inc": { "size_of_array": -1 } 
    } 
) 

Da die Abfragebedingung übereinstimmen muss, wenn das Arrayelement beim Hinzufügen bereits vorhanden war, gibt es keine Übereinstimmung und es werden die Operationen $push oder $inc ausgeführt. Dasselbe gilt für den Fall $pull, in dem das Element nicht in dem Array vorhanden ist.

+0

Perfekt. Vielen Dank. – jeremieca

Verwandte Themen