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

问题描述 投票:4回答:4

我正在使用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仍具有与更新前相同的值。

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

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

c# mongodb
4个回答
2
投票

您需要查询:{safe: true, 'new' : true}

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

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

看起来最后一个参数是“新”选项。


7
投票

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

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

   });

1
投票

使用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);

0
投票

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

new FindOneAndUpdateOptions<T> { ReturnDocument = ReturnDocument.After }
© www.soinside.com 2019 - 2024. All rights reserved.