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

时间:2014-04-22 16:37:38

标签: c# mongodb

我正在使用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()返回修改后的文档吗?

4 个答案:

答案 0 :(得分:7)

扩展Will Shavers&#39;回答,这是使用c#驱动程序的正确方法:

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

   });

答案 1 :(得分:2)

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

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

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

看起来最后一个参数是&#34; new&#34;选项。

答案 2 :(得分: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);

答案 3 :(得分:1)

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

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