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

Jak ustalić, czy $addToSet rzeczywiście dodał nowy element do dokumentu MongoDB, czy element już istniał?

Oczywiście to, co tutaj robisz, to sprawdzanie odpowiedzi, która wskazuje, czy dokument został zaktualizowany lub wstawiony, czy w rzeczywistości nie doszło do żadnej operacji. To jest twój najlepszy wskaźnik jak dla $addToSet aby przeprowadzić aktualizację, dokument zostanie zaktualizowany.

$addToSet sam operator nie może tworzyć duplikatów, taka jest natura operatora. Ale rzeczywiście możesz mieć pewne problemy z logiką:

{                                                
      "$addToSet", new BsonDocument()
           {
                { "items", new BsonDocument()
                     {
                          { "id", item.Id },
                          { "v", item.Value } 
                     }
                }
           }
 }

Wyraźnie pokazujesz, że element w twoim „zestawie” składa się z dwóch pól, więc jeśli ta zawartość różni się w jakikolwiek sposób (tj. ten sam identyfikator, ale inna wartość), to przedmiot jest w rzeczywistości „unikalnym” członkiem zestawu i będzie być dodany. Nie byłoby mowy na przykład na $addToSet operator, aby nie dodawać nowych wartości wyłącznie na podstawie „id” jako unikalnego identyfikatora. Musiałbyś faktycznie umieścić to w kodzie.

Drugą możliwością dla formy duplikatu jest to, że część zapytania nie znajduje poprawnie dokumentu, który ma zostać zaktualizowany. Rezultatem tego byłoby utworzenie nowego dokumentu, który zawiera tylko nowo określonego członka w „zestawie”. Tak więc częstym błędem w użyciu jest coś takiego:

db.collection.update(
    { 
        "id": ABC,
        "items": { "$elemMatch": {
            "id": 123, "v": 10
         }},
    {
        "$addToSet": {
            "items": {
                "id": 123, "v": 10
            }
        }
    },
    { "upsert": true }
)

Rezultatem tego rodzaju operacji będzie zawsze utworzenie nowego dokumentu, ponieważ istniejący dokument nie zawierał określonego elementu w „zestawie”. Prawidłowa implementacja to nie sprawdź obecność elementu „set” i zezwól na $addToSet wykonać pracę.

Jeśli rzeczywiście masz prawdę zduplikowane wpisy występujące w „zestawie”, w którym wszystkie elementy poddokumentu są dokładnie takie same, jest to spowodowane przez jakiś inny kod obecny lub przeszły.

Jeśli masz pewność, że tworzone są nowe wpisy, przejrzyj kod pod kątem wystąpień $push lub rzeczywiście i manipulowanie tablicą w kodzie, który wydaje się działać na tym samym polu.

Ale jeśli używasz operatora poprawnie, to $addToSet robi dokładnie to, do czego jest przeznaczony.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:Jak sprawdzić, czy pole tablicy zawiera element?

  2. Nieprawidłowy ns podczas łączenia się z serwerem mongodb

  3. Błąd 504 podczas wstawiania do bazy danych mongo

  4. Jak znaleźć wszystkie kolekcje z mangusty

  5. ng-jeśli jest wywoływany więcej razy niż powinien