我正在投影mongodb文档本身,但一个可行而另一个没有

时间:2019-07-28 01:42:05

标签: c# mongodb asp.net-core .net-core asp.net-core-webapi

我正在将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中有一个嵌入式对象吗?

1 个答案:

答案 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;

请注意,第二步从数据库中检索匹配的模型后,将在内存中进行排序。