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

Aktualizuj wiele, jeśli istnieje , w przeciwnym razie utwórz nowy dokument dla każdego LeadId, który nie istnieje

Z zapytania, ponieważ robisz .updateMany() , nie musisz robić { multi: true } . W każdym razie zwykle możesz zrobić upsert za pomocą {upset: true} , ale najlepiej byłoby utworzyć nowy dokument na podstawie kryteriów filtrowania z polami aktualizacji z zapytania wejściowego tylko wtedy, gdy w DB nie zostanie znalezione żadne dopasowanie. Ale skoro tutaj mamy listę ($in ) w kryteriach filtrowania może nie działać normalnie, spróbuj tego :

let winnerLeads = [1, 2, 3, 31, 5]
let groupTarget = 1
let howManyClaims = 2
let bulkArr = []
for (i of winnerLeads) {
    bulkArr.push({
        updateOne: {
            "filter": {
                LeadId: i,
                TargetedToBeClaimedByClientType: groupTarget
            },
            // If you wanted it to be incremented rather than replace the field, then try `$inc` instead of `$set`.
            "update": { $set: { TotalClaimsToBeClaimedByClientType: howManyClaims } },
            "upsert": true
        }
    })
}
db.EightWeekGamePlan.bulkWrite(bulkArr);

Dane kolekcji:

/* 1 */
{
    "_id" : ObjectId("5e06eb8f400289966e00fac2"),
    "LeadId" : 1,
    "TotalClaimsToBeClaimedByClientType" : 1.0,
    "TargetedToBeClaimedByClientType" : 1
}

/* 2 */
{
    "_id" : ObjectId("5e06eb98400289966e00fb88"),
    "LeadId" : 2,
    "TotalClaimsToBeClaimedByClientType" : 1.0,
    "TargetedToBeClaimedByClientType" : 1
}

/* 3 */
{
    "_id" : ObjectId("5e06eba0400289966e00fc47"),
    "LeadId" : 3,
    "TotalClaimsToBeClaimedByClientType" : 0,
    "TargetedToBeClaimedByClientType" : 11
}

/* 4 */
{
    "_id" : ObjectId("5e06ebac400289966e00fd4b"),
    "LeadId" : 4,
    "TotalClaimsToBeClaimedByClientType" : 1,
    "TargetedToBeClaimedByClientType" : 11
}

/* 5 */
{
    "_id" : ObjectId("5e06ecef400289966e01273a"),
    "LeadId" : 5,
    "TotalClaimsToBeClaimedByClientType" : 1.0,
    "TargetedToBeClaimedByClientType" : 1
}

Wynik:

/* 1 */
{
    "_id" : ObjectId("5e06eb8f400289966e00fac2"),
    "LeadId" : 1,
    "TotalClaimsToBeClaimedByClientType" : 2.0,
    "TargetedToBeClaimedByClientType" : 1
}

/* 2 */
{
    "_id" : ObjectId("5e06eb98400289966e00fb88"),
    "LeadId" : 2,
    "TotalClaimsToBeClaimedByClientType" : 2.0,
    "TargetedToBeClaimedByClientType" : 1
}

/* 3 */
{
    "_id" : ObjectId("5e06eba0400289966e00fc47"),
    "LeadId" : 3,
    "TotalClaimsToBeClaimedByClientType" : 0,
    "TargetedToBeClaimedByClientType" : 11
}

/* 4 */
{
    "_id" : ObjectId("5e06ebac400289966e00fd4b"),
    "LeadId" : 4,
    "TotalClaimsToBeClaimedByClientType" : 1,
    "TargetedToBeClaimedByClientType" : 11
}

/* 5 */
{
    "_id" : ObjectId("5e06ecef400289966e01273a"),
    "LeadId" : 5,
    "TotalClaimsToBeClaimedByClientType" : 2,
    "TargetedToBeClaimedByClientType" : 1
}

/* 6 */
{
    "_id" : ObjectId("5e071eb1400289966e0597a0"),
    "TargetedToBeClaimedByClientType" : 1.0,
    "LeadId" : 3.0,
    "TotalClaimsToBeClaimedByClientType" : 2.0
}

/* 7 */
{
    "_id" : ObjectId("5e071e62400289966e059168"),
    "TargetedToBeClaimedByClientType" : 1.0,
    "LeadId" : 31.0,
    "TotalClaimsToBeClaimedByClientType" : 2.0
}

Zasadniczo bulkWrite nie zwraca żadnych dokumentów z wyjątkiem wyniku zapisu, możesz zweryfikować w bazie danych wynik operacji aktualizacji, również z powyższego wyniku 6 dostałem wstawkę jako LeadId : 3 + TargetedToBeClaimedByClientType" : 1.0 (Więc LeadId:3 jest zduplikowana) kombinacja nie występuje w DB i 7 został wstawiony jako LeadId : 31 nie ma w DB, pozostałe 1 ,2 ,5 TotalClaimsToBeClaimedByClientType został zaktualizowany.

Ref.: bulkWrite




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Dlaczego otrzymuję pymongo.cursor.Cursor, gdy próbuję wysłać zapytanie do bazy danych mongodb za pośrednictwem pymongo?

  2. Wyjątek limitu czasu gniazda w Mongo

  3. Jak przekonwertować ciąg na objectId w LocalField dla $lookup Mongodb

  4. MongoDB:aktualizowanie każdego dokumentu w kolekcji

  5. mongodb multi tenacy zaklęcie z @Document