我正在使用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()
返回修改后的文档吗?
您需要查询:{safe: true, 'new' : true}
我不确定如何在c#驱动程序中发送这些选项。
http://docs.mongodb.org/ecosystem/tutorial/use-csharp-driver/#findandmodify-method
看起来最后一个参数是“新”选项。
为了扩展Will Shavers的答案,这是使用c#驱动程序的正确方法:
collection.FindAndModify(
new FindAndModifyArgs()
{
Query = query,
Update = updateOperation,
// this needs to be set
VersionReturned = FindAndModifyDocumentVersion.Modified
});
使用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 }