使用'ObjectId'查询MongoDB

Mik*_*nes 29 .net c# mongodb mongodb-.net-driver

我已经将documents插入MongoDB而没有id.我想通过搜索默认分配的MongoDBObjectId来检索它们.

这是我的尝试 -

var query_id = Query.EQ("_id", "50ed4e7d5baffd13a44d0153");
var entity = dbCollection.FindOne(query_id);
return entity.ToString();
Run Code Online (Sandbox Code Playgroud)

我得到以下错误 -

发生了'System.NullReferenceException'类型的第一次机会异常

问题是什么?

sou*_*eck 54

您需要创建一个实例,ObjectId然后使用该实例进行查询,否则您的查询会将ObjectIds与string 进行比较,并且无法找到匹配的文档.

这应该工作:

var query_id = Query.EQ("_id", ObjectId.Parse("50ed4e7d5baffd13a44d0153"));
var entity = dbCollection.FindOne(query_id);
return entity.ToString();
Run Code Online (Sandbox Code Playgroud)

  • 这个答案几乎是正确的.至少在C#中,似乎不再存在FindOne()方法.将其替换为FindOneAs().这是一个很好的例子的链接,这个使用FindAs(),但它的原理是相同的:http://stackoverflow.com/a/12345580/2705003 (3认同)
  • 现在不再有FineAs或FindOneAs方法,应改用Minhas Kamal答案 (2认同)

Min*_*mal 27

C#中为最新的官方MongoDB.Driver写这个 -

var filter_id = Builders<MODEL_NAME>.Filter.Eq("id", ObjectId.Parse("50ed4e7d5baffd13a44d0153"));
var entity = dbCollection.Find(filter).FirstOrDefault();
return entity.ToString();
Run Code Online (Sandbox Code Playgroud)

我们可以完成相同的结果,而无需id从字符串转换为ObjectId.但是,我们必须在模型类中添加属性[BsonRepresentation(BsonType.ObjectId)]之前id.

使用lambda表达式甚至可以进一步简化代码-

var entity = dbCollection.Find(document => document.id == "50ed4e7d5baffd13a44d0153").FirstOrDefault();
return entity.ToString();
Run Code Online (Sandbox Code Playgroud)