【问题标题】:Linq to mongodb: unexpected behaviour in subquery conditionLinq to mongodb:子查询条件下的意外行为
【发布时间】:2018-06-19 19:26:35
【问题描述】:

有一类persons,认识好几位作者,有一个偏爱的作者:

  public class Author
  {
    public string name;
    public string firstname;
  }

  public class Person
  {
    public string favoredAuthor;
    public Author[] knownAuthors;
  }

json 表示如下所示:

{
    "_id" : ObjectId("5b2955cf79cd67d3d09ddbe8"),
    "knownAuthors" : [ 
        {
            "name" : "Müllmann",
            "firstname" : "Dieter"
        }, 
        {
            "name" : "Marx",
            "firstname" : "Karl"
        }, 
        {
            "name" : "Hildebrandt",
            "firstname" : "Saftarsch"
        }
    ],
    "favoredAuthor" : "Marx"
}

我想使用以下 linq 表达式查询该人偏爱的 -Author-:

// gives no result:
var favoredAuthor = persons.AsQueryable()
    .Select(x => x.knownAuthors.Where(a => a.name == x.favoredAuthor))
     .FirstOrDefault();

如果我处理人员列表,则同样有效:

// working (result is Author 'Karl Marx'):
var persons = new List<Person>() { new Person() }.AsQueryable();
var person = persons.Select(x => x.knownAuthors.Where(a => a.name == x.favoredAuthor).FirstOrDefault()) 
        .FirstOrDefault();

这是官方 MongoDB 驱动程序中的错误吗?还是我做错了? 我用 视觉工作室 2017 MongoDb 驱动 2.7.0 和 2.6.1

有什么想法吗,男孩女孩?

【问题讨论】:

  • 问题不是子查询,而是同一个文档的两个字段的比较(“自连接”)。就我而言,解决方案是将属性 isFavoredAuthor 添加到 Author 类。

标签: c# mongodb linq mongodb-query


【解决方案1】:

MongoDB 无法像这样比较两个字段。这是数据库系统的限制;例如,请参阅 MongoDB : querying documents with two equal fields, $match and $eq 和潜在的解决方法(请务必了解性能成本)。

上次我们遇到这种情况时,我们记录了它,并确保在从服务器获取数据集后将foo == bar 条件与 LINQ-to-Objects 一起应用。

【讨论】:

  • 感谢您的快速回答!你能为此目的推荐一个更好的设计吗? a) 我想存储所有已知的作者。 b) 我想引用喜欢的作者。 c) 我想在不加载整个文档或所有作者的情况下查询喜欢的作者。 d) 我不想存储作者的副本
  • 听起来对我来说很相关...您是否考虑过使用 MySQL/MSSQL/等?将作者存储在一个表中,将人员存储在另一个表中,以及使用 personid / authorid 的关系表“knownAuthors”,favouriteAuthorId 成为表 people 上的一个字段,强制引用完整性以验证最喜欢的作者是否在 knownAuthors 中。如果您必须使用 Mongo,我认为您很难轻松满足这些标准。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多