【问题标题】:i am projecting the mongodb document itself but one works and the other doesn't我正在投影 mongodb 文档本身,但一个有效,另一个无效
【发布时间】:2019-07-28 01:42:05
【问题描述】:

我将 mongodb 用于我的 .net 核心 web api。我有 2 个模型返回给客户:

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 &lt;document&gt; 的例外。我看了其他帖子,但我真的不明白他们的意思。

我想我是在我的第一个 Get 中投影文档本身,这行得通吗?是不是因为我的Model2里面有嵌入对象?

【问题讨论】:

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


    【解决方案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;
    

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

    【讨论】:

    • 感谢您的代码。在您的第一步中,我还能打电话给evaludate()吗?因为似乎我无法在 MongoDB 的 Find() 中调用自定义函数。
    • 不,你不能。 mongodb linq 的功能与常规 linq 的功能不同。您在 linq 中编写的内容应该可以直接翻译成 mongo 查询语言。在您精通 mongo-linq 之前,请始终尝试查看您的 linq 被翻译成的 mongo 查询。您可以通过在代码中执行 query.ToString() 或使用 db.setProfilingLevel(2) 在数据库中启用分析,然后使用类似 db.system.profile.find().skip(1).limit(6).sort( { ts : -1 } ).pretty() 的内容查看最后几个查询来做到这一点
    • 这两个链接将让您了解支持和不支持的内容:LINQExpressions
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    相关资源
    最近更新 更多