我在mongodb集合中有以下文档
{
"_id" : "52bbd9bef2ba1f37f4f010c1",
"Name" : "Some Name",
"TypeId" : 1
}
我现在想使用c#驱动程序
编辑此文档BsonDocument doc = BsonDocument.Parse(json);
IMongoQuery query = Query.And(Query.EQ("_id", doc["_id"]));
UpdateBuilder ub = MongoDB.Driver.Builders.Update.Set('Name', 'New Name');
WriteConcernResult updatedBook = _collection.Update(query, ub);
if (!updatedBook.UpdatedExisting)
{
// I always end here
}
docs告诉_collection.Update(query, ub)
在返回BsonDocument
时应返回WriteConcernResult
,这也很奇怪。无论如何,如果我使用另一个属性,那么_id
我找到了记录。
似乎MongoDB期望在ObjectId()
附近有一个ObjectId
函数包装器,不是吗?至少我在使用MongoVUE
时的测试中需要这个。
修改
如果我尝试使用此查询找到记录
{
"_id" : "52bbd9bef2ba1f37f4f010c1"
}
我一无所获。如果我用这个
{
"_id" : ObjectId("52bbd9bef2ba1f37f4f010c1"),
}
它奏效了。这么多的Javascript方式。 AFAIK我有两种方法可以使用本机.net驱动程序更新记录:
FindAndModifyResult
WriteConcernResult
但两种方式都期望BsonValue
为ObjectId
似乎不是有效的值...
所以我尝试使用
IMongoQuery query = Query.And(Query.EQ(“_ id”,doc [“_ id”]));
如上所述,但与
相同{
"_id" : "52bbd9bef2ba1f37f4f010c1"
}
所以我想知道如何通过它ObjectId
更新文档?
答案 0 :(得分:1)
当使用当前可用的Nuget发布的MongoDB驱动程序用于.NET时,我可以确认此代码作为示例正常工作:
MongoClient client = new MongoClient(); // connect to localhost
MongoServer server = client.GetServer();
MongoDatabase test = server.GetDatabase("test");
MongoCollection examples = test.GetCollection("examples");
string id = "52bc958ca45026c2ff24f90b";
IMongoQuery query = Query.EQ("_id", ObjectId.Parse(id));
UpdateBuilder ub = Update.Set("Name", "George");
WriteConcernResult updatedBook = examples.Update(query, ub);
使用此收集数据:
> db.examples.remove()
> db.examples.insert({Name:"Larry"})
> db.examples.find()
{ "_id" : ObjectId("52bc958ca45026c2ff24f90b"), "Name" : "Larry" }
然后,运行上面的C#代码并再次检查集合:
> db.examples.find()
{ "Name" : "George", "_id" : ObjectId("52bc958ca45026c2ff24f90b") }
虽然WriteConcernResult
类本身不是BsonDocument
,但Response
属性包含命令的响应。
我还删除了不必要的Query.And
,因为当只有一个条件时它没有做任何事情:
query = { "_id" : ObjectId("52bc958ca45026c2ff24f90b") }
ub = { "$set" : { "Name" : "George" } }