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