【问题标题】:c# MongoDB driver: FindOneAndUpdate how to know if it has found a document?c# MongoDB驱动:FindOneAndUpdate如何知道是否找到了文件?
【发布时间】:2019-06-17 03:14:42
【问题描述】:

因此,如果对象存在,我将使用 MongoDB 驱动程序更新数据库中的对象字段值。

 IMongoDatabase db = _mongoClient.GetDatabase(DataBase);
 IMongoCollection<Evento> collection = db.GetCollection<Evento>(str_collection);

 collection.FindOneAndUpdate(
     e => e._id == eventoId &&
     e._visitantes.Any(v => v._empresa == empresa &&
         v._nombre == nombre &&
         v._apellidos == apellidos),
     Builders<Evento>.Update.Set(e => e._visitantes[-1]._asistido, true));

我的问题是:我如何知道该对象已在数据库中找到?我看过文档,但没有找到任何东西。

在它不存在的情况下,我不想创建一个新的对象,我只想知道一个对象是否被发现改变了值。

谢谢。

【问题讨论】:

  • 检查 FindOneAndUpdate 返回的结果,在控制台 Mongo 返回有多少对象受到影响,结果可能包含此信息。

标签: c# mongodb


【解决方案1】:

FindOneAndUpdate 将返回一个文档。您可以使用FindOneAndUpdateOptionsReturnDocument 属性配置这是文档的旧版本还是更新版本。将ReturnDocument 设置为ReturnDocument.Before 可确保返回的文档是更新之前存在的文档,如果不存在文档,则为null。这是一个例子:

var documentBefore = collection.FindOneAndUpdate(
    filterDefinition,
    updateDefinition,
    new FindOneAndUpdateOptions { ReturnDocument = ReturnDocument.Before });

if (documentBefore != null)
{
    // The document already existed and was updated.
}
else
{
    // The document did not exist and was inserted.
}

【讨论】:

    【解决方案2】:

    猫鼬documentation选项部分声明:

    选项:

    • ...
    • upsert: bool - 如果对象不存在则创建它。默认为 false。
    • ...

    应该有一个upsert 参数,如果设置为true,如果没有找到,将创建一个新对象。但是,这默认为 false,因此您的调用不应创建新的数据库条目。

    我认为C# driver 的行为应该相同。如果没有,您可以将Upsert 参数设置为false,请参阅here

    【讨论】:

    • 为什么官方 C# 驱动程序的行为与第三方 ORM 实现相同?!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 2015-05-17
    相关资源
    最近更新 更多