MonogDB C# 驱动程序 LINQ 查询在按_id筛选时不起作用



我目前正在尝试构建一个使用C#驱动程序与MongoDB接口的Web API。

GET 路由使用多个可选参数,这些参数根据请求中的参数动态生成 LINQ 查询。 我遇到的问题是按_id过滤时,它总是无法返回数据;这些尝试包括_id.ToString((以及一个简单的_id== id比较。 我已经尝试了几种比较id参数和文档_id的方法,但没有一种奏效。 根本没有 where 子句,或者按文档中的任何其他字段以任意组合进行筛选,都会按预期返回数据。

这是代码段目前的样子:

var testId = new ObjectId(id);
var result = collection.AsQueryable<Terrain>()
.Where(t => t._id.Equals(testId))
.Select(t => t);
return Json(result);

这将返回一个空结果 []。 我只能假设我对_id存储数据库的方式误解了某些内容,并在此处查询。 出于测试目的,我通过将_id值从 Robo 3T 中复制出来获取参数 id 的值。

  • 请分享您的"地形"模型
  • 请注意,您正在启动一个空的 testId 对象,并且您正在尝试将文档_id与空对象匹配。您应该使用要查找的对象标识符设置 testId(例如:var testId = new ObjectId("12345"( (

尝试删除 .在最后选择(它实际上是投影文档结果,如果您想拥有完整的文档 - 不需要(

此外,在查询末尾添加 。第一(( -或- 。FirstOrDefault((

它应该看起来像这样:

var result = collection.AsQueryable()
.Where(t => t._id == testId)
.FirstOrDefault();

另一种方法是仅使用简单的.查找((:

var result = collection
.Find<Terrain>(t => t._id == testId)
.FirstOrDefault();

_id属性需要按如下方式装饰。 数据库将_id存储为字符串而不是 ObjectID。

namespace RIDBAPI.Models
{

public class Terrain
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string _id { get; set; }
[BsonElement("prefab")]
public string prefab { get; set; }
[BsonElement("colour")]
public string colour { get; set; }
[BsonElement("v3")]
public decimal[] v3 { get; set; }
}
}

最新更新