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

Mongo zbiorczo znaleźć i zaktualizować pola pasujących dokumentów w jednym zapytaniu?

Aby zwiększyć wydajność, skorzystaj z funkcji Bulk() Interfejs API do wydajnej zbiorczej aktualizacji kolekcji, ponieważ będziesz wysyłać operacje do serwera w partiach (na przykład, powiedzmy, że wielkość partii wynosi 500). Daje to znacznie lepszą wydajność, ponieważ nie będziesz wysyłać każdego żądania do serwera, ale tylko raz na 500 żądań, dzięki czemu Twoje aktualizacje będą wydajniejsze i szybsze.

Poniżej przedstawiono to podejście, pierwszy przykład wykorzystuje Bulk() API dostępne w wersjach MongoDB>=2.6 i <3.2. Aktualizuje wszystkie dopasowane dokumenty w kolekcji z danej tablicy, zwiększając 1 do pokazanego pola. Zakłada, że ​​tablica obrazów ma strukturę

var images = [
    { "_id": 1, "name": "img_1.png" },
    { "_id": 2, "name": "img_2.png" }
    { "_id": 3, "name": "img_3.png" },
    ...
    { "_id": n, "name": "img_n.png" }
]

Wersje MongoDB>=2.6 i <3.2 :

var bulk = db.images.initializeUnorderedBulkOp(),
    counter = 0;

images.forEach(function (doc) {    
    bulk.find({ "_id": doc._id }).updateOne({ 
        "$inc": { "shown": 1 }
    });

    counter++;
    if (counter % 500 === 0) {
        // Execute per 500 operations
        bulk.execute(); 
        // re-initialize every 500 update statements
        bulk = db.images.initializeUnorderedBulkOp();
    }
})
// Clean up remaining queue
if (counter % 500 !== 0) { bulk.execute(); }

Następny przykład dotyczy nowej wersji MongoDB 3.2, która od tego czasu wycofała Bulk() API i udostępnił nowszy zestaw API przy użyciu bulkWrite() .

MongoDB w wersji 3.2 i nowszych :

var ops = [];
images.forEach(function(doc) {
    ops.push({
        "updateOne": {
            "filter": { "_id": doc._id },
            "update": {
                "$inc": { "shown": 1 }
            }
        }
    });

    if (ops.length === 500 ) {
        db.images.bulkWrite(ops);
        ops = [];
    }
})

if (ops.length > 0)  
    db.images.bulkWrite(ops);



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Skrobanie i indeksowanie stron internetowych za pomocą Scrapy i MongoDB

  2. Przegląd narzędzia MongoDB Database Profiler

  3. MongoDB insertOne()

  4. Wydajność MongoDB:uruchamianie operacji MongoDB Map-Reduce na serwerach pomocniczych

  5. Jak mogę przechowywać porę dnia w MongoDB? Jako ciąg? Podaj dowolny rok/miesiąc/dzień?