MongoDb中的FindAndModify()不返回更改后的文档

本文关键字:文档 返回 中的 FindAndModify MongoDb | 更新日期: 2023-09-27 17:59:19

我正在使用FindAndModify修改文档。

文档类型为User,要修改的元素称为web:

var users = _db.GetCollection<User>(UserCollectionName);
var userQuery = Query.EQ("user", "testuser");
var findAndModifyResult = users.FindAndModify(
       new FindAndModifyArgs()
       {
           Query = userQuery,
           Update = Update.Set("web", "testweb")   
       });
// user.web is unchanged in the result
var user = findAndModifyResult.GetModifiedDocumentAs<User>();
// user.web is changed in the result
user = users.FindOne(userQuery);

GetModifiedDocumentAs()不返回更改后的实例,user.web仍然具有更新前的值。

当我用FindOne()查询user时,我看到了更改后的值。

有什么事情需要我处理,以便FindAndModify()返回修改后的文档吗?

MongoDb中的FindAndModify()不返回更改后的文档

要扩展Will Shavers的答案,这是使用c#驱动程序的正确方法:

collection.FindAndModify(
   new FindAndModifyArgs()
   {
       Query = query,
       Update = updateOperation,
       // this needs to be set
       VersionReturned = FindAndModifyDocumentVersion.Modified
   });

您需要使用:{safe: true, 'new' : true} 进行查询

我不知道如何在c#驱动程序中发送这些选项。

http://docs.mongodb.org/ecosystem/tutorial/use-csharp-driver/#findandmodify-方法

看起来最后一个参数是"new"选项。

使用FindAndModifyArgs是正确的方法。此方法的所有重载(除此之外)都已从2.0版本中弃用。这里有一个例子,我们发现一个对象的字段IsBusy为false,我们将其更改为true,然后返回它:

FindAndModifyArgs findAndModifyArgs;
FindAndModifyResult mongoResponse;
IMongoQuery   mongoQuery      = Query.EQ  ("IsBusy", false);
UpdateBuilder updateStatement = Update.Set("IsBusy", true);
// Finding a not busy app, and updating it to busy.
findAndModifyArgs = new FindAndModifyArgs()
{
    Query           = mongoQuery,
    Update          = updateStatement,
    SortBy          = null,
    VersionReturned = FindAndModifyDocumentVersion.Modified
 };
mongoResponse = _database.GetCollection<QueuedApp>(collectionName).FindAndModify(findAndModifyArgs);
return BsonSerializer.Deserialize<QueuedApp>(mongoResponse.ModifiedDocument);

从版本2.10.2开始,该方法被称为FindOneAndUpdate,您必须将作为最后一个参数传递

new FindOneAndUpdateOptions<T> { ReturnDocument = ReturnDocument.After }