如何通过ObjectId查找文档?

时间:2013-12-26 08:27:02

标签: c# .net mongodb

我在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

但两种方式都期望BsonValueObjectId似乎不是有效的值...

所以我尝试使用

IMongoQuery query = Query.And(Query.EQ(“_ id”,doc [“_ id”]));

如上所述,但与

相同
{
  "_id" : "52bbd9bef2ba1f37f4f010c1"
}

所以我想知道如何通过它ObjectId更新文档?

1 个答案:

答案 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" } }