MogoDB findAndModify возвращает WriteResult - PullRequest
1 голос
/ 26 мая 2020

Я делаю запрос с logi c «вставить, если не существует». Могу ли я вернуть результат апсерта без дополнительных запросов?

 var u = Builders<Blog>.Update
                .SetOnInsert(f => f.BlogId, blogId)
                .SetOnInsert(f => f.VideoId, videoId)
                -- other fields...

var blog = Blog.FindOneAndUpdate<Blog>(c => c.BlogId == blogId && c.VideoId == VideoId, u, 
   new FindOneAndUpdateOptions<Blog>{IsUpsert = true, ReturnDocument = ReturnDocument.After}
);

bool wasUpsert =  ? 
return wasUpsert;

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Я бы сделал это так:

var filter = Builders<MyCollectionModel>.Filter
    .Eq(x => x.Id, ObjectId.Parse("5ecd93f739a1c716ab2c2d44"));
var update = Builders<MyCollectionModel>.Update.Set(x => x.Email, "john.smith@gmail.com");
var updateResult = await context.MyCollectionModel
    .UpdateOneAsync(filter, update, new UpdateOptions {IsUpsert = true});
updateResult.Dump(); // LINQPad

Тогда, если документ с таким идентификатором существует, но изменений не было, вы получите:

enter image description here

, если документ с этим идентификатором существует и адрес электронной почты был изменен, вы получите:

enter image description here

и, наконец, если документ не существует, поэтому он был добавлен, UpsertedId покажет его идентификатор.

0 голосов
/ 26 мая 2020

Используйте параметр new: true, см. 4.0 примечания к выпуску .

Milestone.findOneAndUpdate({
    ......
}, {
    ......
}, {upsert: true, 'new': true}, function(err, res) {
    // err === null
    // res === null
    done(err, res);
});
...