MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да определите дали $addToSet действително е добавил нов елемент в MongoDB документ или елементът вече е съществувал?

Разбира се, това, което правите тук, всъщност е проверка на отговора, който показва дали даден документ е бил актуализиран или вмъкнат или всъщност дали нито една от двете операции не е извършена. Това е най-добрият ви показател за $addToSet ако е извършена актуализация, документът ще бъде актуализиран.

$addToSet самият оператор не може да произвежда дубликати, това е природата на оператора. Но наистина може да имате проблеми с логиката си:

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

Толкова ясно показвате, че елемент във вашия „набор“ е съставен от две полета, така че ако това съдържание варира по някакъв начин (т.е. същият идентификатор, но различна стойност), тогава елементът всъщност е „уникален“ член на набора и ще бъде добавен. Няма да има начин например за $addToSet оператор, за да не добавя нови стойности само въз основа на „id“ като уникален идентификатор. Всъщност ще трябва да включите това в код.

Втората възможност тук за форма на дубликат е, че вашата част от заявката не намира правилно документа, който трябва да бъде актуализиран. Резултатът от това ще бъде създаването на нов документ, който съдържа само новопосочения член в "набора". Така че често срещана грешка при използване е нещо като това:

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

Резултатът от този вид операция винаги ще създаде нов документ, тъй като съществуващият документ не съдържа посочения елемент в "набора". Правилното внедряване е дане проверете за присъствието на члена "set" и разрешете $addToSet да свърши работата.

Ако наистина имате вярно дублиращи се записи, появяващи се в „набора“, където всички елементи на поддокумента са абсолютно еднакви, тогава това е причинено от някакъв друг код, който е настоящ или в миналото.

Когато сте сигурни, че се създават нови записи, прегледайте кода за случаи на $push или наистина и манипулиране на масив в код, който изглежда действа върху същото поле.

Но ако използвате оператора правилно, тогава $addToSet прави точно това, което е предназначено.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Динамично създаване на индекс с mongoid

  2. mongoDB:как да обърна $unwind

  3. MongoDB заявка за главна първа буква в съществуваща база данни

  4. Автоматично изчисляване на полета в mongodb

  5. Защо Spring ReactiveMongoRepository няма метод за запазване за Mono?