Я хочу выполнить несколько запросов upsert с помощью bulkWrite (). Но проблема в том, что bulkWrite возвращает только вставленные _ids, а не обновленные _ids. Как мне получить все _ids в этом запросе?
var insertCommand = Builders<myObject>.Update.SetOnInsert(d => d.Name, object.Name).SetOnInsert(d => d.Age, object.Age);
var updateCommand = Builders<myObject>.Update.Set(d => d.LastRequest, object.DateTime);
var updateQueries = Builders<myObject>.Update.Combine(new[] { updateCommand, insertCommand });
var filter = Builders<myObject>.Filter;
var findQuery = filter.And(filter.Eq(e => e.Name, object.Name), filter.Eq(e => e.City, object.City));
var upsertObject = new UpdateOneModel<myObject>(findQuery, updateQueries) { IsUpsert = true };
bulkOps.Add(upsertObject);
var result = await Collection.BulkWriteAsync(bulkOps);
Я не думаю, что с помощью BulkWriteAsync
это можно сделать. документация в операции MongoDB bulkWrite
утверждает следующее:
Returns:
A boolean acknowledged as true if the operation ran with write concern or false if write concern was disabled.
A count for each write operation.
An array containing an _id for each successfully inserted or upserted documents.
Однако для одного экземпляра работает следующее:
var result = collection.FindOneAndUpdate(findQuery, updateQueries, new FindOneAndUpdateOptions<myObject> { IsUpsert = true, ReturnDocument = ReturnDocument.After});
После запуска result
будет содержать измененный документ, включая его _id
.
Спасибо за ваш ответ. Я знал, что могу использовать FindOneAndUpdate
, но не могу использовать его как массовую операцию. Мне нужно сделать что-то массовое.
Боюсь, у вас останется только один выбор в этом случае, когда вам нужно будет получить все _id
заранее, которые будут соответствовать вашему условию поиска, а затем сделать то, что вы делали.
Получили ли вы идентификаторы измененных документов из ответа bulkWrite?