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()
返回修改后的文档吗?
要扩展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 }