有没有办法让MongoDB返回在BulkWrite中成功替换哪些ID?

时间:2018-03-24 20:57:45

标签: mongodb mongodb-.net-driver

我试图编写一些C#库代码来替换MongoDB中的文档,如下所示:

public async Task<IReadOnlyList<ThingUpdateResult>> UpdateAsync(
    [NotNull] IReadOnlyList<Thing> things, 
    CancellationToken cancellationToken = default(CancellationToken))
{
    if (things == null) throw new ArgumentNullException(nameof(things));

    var writeModels = things
        .Select(i => new ReplaceOneModel<Thing>(
            new ObjectFilterDefinition<Thing>(new {i.Id}), i));

    var result = await _collection
        .BulkWriteAsync(writeModels, new BulkWriteOptions {IsOrdered = false}, cancellationToken)
        .ConfigureAwait(false);

    // Problem:
    var results = result.SuccessfulReplacements // There's no such thing, only ProcessedRequests and Upserts
        .Select(i => new ThingUpdateResult(i.Id.AsString, updated: true))
        .ToArray();

    return results;
}

我试图返回一个结果集合,其中每个结果都包含文档的ID和一个表示是否已成功更新的布尔值。例如,如果things包含MongoDB中不存在的文档,我会给它一个false的结果。

但是...... result并不包含任何相关信息;它只给了我一些比赛。有没有办法找出哪些文件匹配哪些没有?

编辑:刚刚意识到我需要为删除操作做同样的事情,所以我想那里会有类似的情况......

1 个答案:

答案 0 :(得分:0)

我不认为这是可能的,因为WriteResult只返回匹配/更新/ upserted的#而不是他们的ID。

我相信你需要写一个小函数来:

  • 查询对象
  • 保存将被修改的其他属性的ID /值
  • 执行更新
  • 再次查询
  • 比较结果