我正在将mongodb用于.net核心Web API。我有两种返回客户的模型:
public class Model1
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
[BsonElement("name")]
public string Name { get; set; }
}
public class Model2
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
[BsonElement("name")]
public string Name { get; set; }
[BsonElement("data")]
public InnerModel[] Data { get; set; }
}
public class InnerModel
{
[BsonElement("name")]
public string Name { get; set; }
}
在Model
服务中,我通过以下方式使用LINQ:
public (List<Model1> models, int data) Get(string x)
{
var result = from m in db.GetCollection<Model1>("model1")
where m.name == x
select m;
var models = result.Skip(y).Take(y).ToList();
return (models, z);
}
此功能运行良好。
在Model2服务中,我以另一种方式使用LINQ:
public List<Model2> Get(string x)
{
var result = from m in db.GetCollection<Model2>("model2")
let v = evaluate(m, x)
where v > 0
orderby v descending
select m;
return result.Skip(y).Take(y).ToList();
}
但是第二个Get
函数给我一个$project or $group does not support <document>
的例外。我看了其他帖子,但我真的不明白它们的意思。
我想我会在我的第一个Get
中投影文档本身,它会起作用吗?是因为我的Model2
中有一个嵌入式对象吗?
答案 0 :(得分:1)
据我所知,mongodb驱动程序不支持let
来转换为有效的mongo查询。因此您必须执行以下操作。
var query = (from m in db.GetCollection<Model2>("model2").AsQueryable()
where m.Data.Any(d => d.Name == x)
select m)
.Skip(0)
.Take(100);
var sorted = from m in query.ToList()
orderby m.Data.Select(d => d.Name == x).Count() descending
select m;
请注意,第二步从数据库中检索匹配的模型后,将在内存中进行排序。