构造函数 MongoDB.Bson.ObjectId() 在 .NET Core 2 中不起作用

Contructor MongoDB.Bson.ObjectId() does not work in .NET Core 2

我有第一个项目试图使用 MongoDB.Driver 从 mongodb 获取值。我可以连接到数据库和 "GetAll" 但是当发出需要 ObjectId 的请求时我收到异常:

Exception has occurred: CLR/System.IndexOutOfRangeException
An exception of type 'System.IndexOutOfRangeException' occurred in MongoDB.Bson.dll but was not handled in user code: 'Index was outside the bounds of the array.'

更具体:

at MongoDB.Bson.ObjectId.FromByteArray(Byte[] bytes, Int32 offset, Int32& a, Int32& b, Int32& c)
   at MongoDB.Bson.ObjectId..ctor(String value)
   at TodoApi.Controllers.TodoController.GetById(String id) ...

方法 GetById:

[HttpGet("{id}", Name = "GetTodo")]
public IActionResult GetById(string id)
{
    var objId = new ObjectId(id); << this line exceptions occures
    var item = objds.GetTodoItem(objId);

    if (item == null) { return NotFound(); }

    return new ObjectResult(item);
}

DataAccess 中的方法 GetTodoItem:

public TodoItem GetTodoItem(ObjectId id)
{
    var res = Query<TodoItem>.EQ(p=>p.Id,id);
    return _db.GetCollection<TodoItem>("TodoApi").FindOne(res);
}

.csproj

  <ItemGroup>
    <PackageReference Include="MongoDB.Driver" Version="2.5.0" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="MongoDB.Driver.Core" Version="2.5.0" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="MongoDB.Bson" Version="2.5.0" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="mongocsharpdriver" Version="2.5.0" />
  </ItemGroup>

问题出在关于创建新对象 ID 的那一行。 mongoDB 自动提供默认文档 ID,您只需首先找到 ID,然后使用它查询集合。

当然您可以更改默认行为 - 请参阅

http://codingcanvas.com/using-mongodb-_id-field-with-c-pocos/

更改此行:

var objId = new ObjectId(id); 

像这样(您必须将 objectid.Parse() 参数更改为您的值。

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

此外,这行有错字,您是指 = 符号后的 objId 吗?

 var item = objds.GetTodoItem(objId)

学分: Query MongoDB Using 'ObjectId'

您可以像这样生成一个新的 ObjectId:

ObjectId.GenerateNewId();

但很可能您在数据库中找不到任何具有该 ID 的文档。通常,当您想要执行插入并且不希望 Mongo 为新插入的文档分配随机 ID 时,您会生成一个 ObjectId(假设您想要 return 该 ID 返回给用户) .

现在,假设您要查找带有 id = 5a71ae10a41e1656a4a50902 的特定文档,您可以执行以下操作:

var id = "5a71ae10a41e1656a4a50902";
var context = new YourContext();
var builder = Builders<TodoItem>.Filter;
var filter = builder.Eq(x => x.Id, ObjectId.Parse(id));
var result = await context.TodoItemCollection.FindAsync(filter);