【问题标题】:Query on field of a referenced document查询引用文档的字段
【发布时间】:2017-06-30 13:13:06
【问题描述】:

有 2 个集合“演员”和“电影”

1 个演员的例子:

{
  _id: ObjectId("54f38bd9b814dca762778032"),
  name: {
    first: 'Jason',
    last: 'Statham'
  }
}

两部电影的例子

{
  _id: ObjectId("54f5cbaf4d9f1129335993ef"),
  title: 'Fast & Furious 7',
  actors: [
    ObjectId("54f38bd9b814dca762778032")
  ]
},
{
  _id: ObjectId("54f782493e7688c31f75307d"),
  title: 'Parker',
  actors: [
    ObjectId("54f38bd9b814dca762778032")
  ]
}

我怎样才能找到杰森斯坦森的电影? 我使用 Node.js + Express + Mongoose

谢谢

【问题讨论】:

    标签: javascript node.js mongodb mongoose mongodb-query


    【解决方案1】:

    这叫做请求“加入”,这是 MongoDB 无法做到的。

    您可以在运行.populate() 后在代码中使用数组.filter(),但当然这需要先引入“所有内容”。您甚至可以指定对.populate() 的查询以匹配您的条件。但这仍然意味着选择所有的父母。

    您还可以将“parentId”添加到“child”,这样您就可以查询“child”集合,仅选择与父级匹配的文档,或者如果需要,以这种方式“反向填充”。

    或者您可以使用"embedding",而不是尝试重现关系模型并使用 NoSQL 引擎来实现其设计目的。那么你所要求的工作。

    {
        _id: ObjectId("54f5cbaf4d9f1129335993ef"),
        "title": "Fast & Furious 7",
        "actors: [
            { "first": "Jason",  "last": "Statham" }  
        ]
    },
    {
        "_id": ObjectId("54f782493e7688c31f75307d"),
        "title": "Parker",
        "actors": [
            { "first": "Jason",  "last": "Statham" }
        ]
    }
    

    与关系模型和引用模型相比,它确实复制了数据,但这是提高效率的成本。

    如果您不想使用 NoSQL 存储解决方案来获得它本应提供的功能的好处,那么就会产生成本。正如他们所说的那样,马匹适合课程,所以选择正确的工具并以正确的方式使用。

    【讨论】:

    • 显然,我是一个 MySql 用户,而且我是 NoSQL 的新手。我仍在尝试理解这些概念。在用户/文章的情况下,我需要保留集合“用户”才能登录。如果我将整个用户的文档复制到文章文档的'authors'数组中可以吗?
    • @Martial 好的。那么哪些部分您还不清楚,您需要进一步了解?帮我帮你。
    • 谢谢@Neil。我真正需要的是:用户可以使用他们的密码登录我的应用程序。我为此收集了一个“用户”。这些用户可以打开请求。我也有一个收集“请求”。我需要列出用户提出的所有请求。在 MySQL 中,这是“小菜一碟”(Fance 中的手指在鼻子上;))但在 mongodb 中我迷路了。
    • 我应该将用户的参考信息放在请求中还是应该复制用户信息?
    • @Martial 抱歉,我之前错过了您的评论。但是这里的示例是参考您提出的问题的上下文提供的。如果您希望“检查”部分“相关数据”作为查询表达式的一部分,那么最好的情况是根据问题答案的上下文将该数据“嵌入”到“父文档”中问。这回答了所提出的问题。如果您有其他不同情况的问题,那么您最好Ask Another Question 这是本站的目的。
    【解决方案2】:

    假设您知道演员 Jason Statham 的 ID。您所要做的就是找到演员 ID 为 54f38bd9b814dca762778032 的电影,即 Jason Statham 的 _id。这是一个例子。

    model.find({actors: "54f5cbaf4d9f1129335993ef"}, function(err, movies) {
        // You get all movies which an actor Jason Statham
    });
    

    而你的电影 Schema 应该是这样的。

    var movieSchema = new Schema({
        title: String,
        actors: Array
    });
    

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2019-03-21
      • 2017-09-13
      相关资源
      最近更新 更多