(example@sqldat.com , example@sqldat.com )
TL;DR
await GasStation.collection.bulkWrite([ // <<==== use the model name
{
'updateOne': {
'filter': { 'id': '<some id>' },
'update': { '$set': { /* properties to update */ } },
'upsert': true, // <<==== upsert in every document
}
},
/* other operations here... */
]);
Dlouhý příběh:
Po boji s špatná dokumentace rozhraní Mongoose API
, vyřešil jsem hromadné upsert ladění updateOne:{} operaci v bulkWrite() metoda.
Pár nezdokumentovaných věcí ke zvážení:
// suppose:
var GasStation = mongoose.model('gasstation', gasStationsSchema);
var bulkOps = [ ];
// for ( ... each gasStation to upsert ...) {
let gasStation = { country:'a', localId:'b', xyz:'c' };
// [populate gasStation as needed]
// Each document should look like this: (note the 'upsert': true)
let upsertDoc = {
'updateOne': {
'filter': { 'country': gasStation.country, 'localId': gasStation.localId },
'update': gasStation,
'upsert': true
}};
bulkOps.push(upsertDoc);
// end for loop
// now bulkWrite (note the use of 'Model.collection')
GasStation.collection.bulkWrite(bulkOps)
.then( bulkWriteOpResult => {
console.log('BULK update OK');
console.log(JSON.stringify(bulkWriteOpResult, null, 2));
})
.catch( err => {
console.log('BULK update error');
console.log(JSON.stringify(err, null, 2));
});
Dvě klíčové věci jsou neúplné problémy s dokumentací API (alespoň v době psaní):
'upsert': truev každém dokumentu . Toto není zdokumentováno v Mongoose API (), které často odkazuje na node-mongodb-native Řidič. Podívejte se na updateOne v tomto ovladači , můžete uvažovat o přidání'options':{'upsert': true}, ale ne... to nepůjde. Také jsem se pokusil přidat oba případy dobulkWrite(,[options],)argument, také bez účinku.GasStation.collection.bulkWrite(). Ačkoli metoda Mongoose bulkWrite() tvrdí, že by se měl jmenovatModel.bulkWrite()(v tomto případěGasStation.bulkWrite()), která spustíMongoError: Unknown modifier: $__. TakžeModel.collection.bulkWrite()musí být použit.
Poznámka:
Nemusíte používat$setoperátor mongo vupdateOne.updatepole, protože mongoose to zpracovává v případě upsert (viz příklad komentáře BulkWrite() ).- Všimněte si, že můj jedinečný index ve schématu (potřebný pro správnou funkci upsert) je definován takto:
gasStationsSchema.index({ country: 1, localId: 1 }, { unique: true });
Doufám, že to pomůže.
==> UPRAVIT:(Mongos 5?)
Jak si všiml @JustinSmith, $set Zdá se, že operátor přidaný Mongoose již nefunguje. Možná je to kvůli Mongoose 5?
V každém případě pomocí $set explicitně by měl udělat:
'update': { '$set': gasStation },