查询引用文档的字段

时间:2015-03-06 01:08:18

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

有2个系列'演员'和电影'

1名演员的例子:

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

2部电影的例子

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

如何使用Jason Statham查找电影? 我使用Node.js + Express + Mongoose

由于

2 个答案:

答案 0 :(得分:3)

这就是要求“加入”,这是MongoDB无法做到的。

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

您还可以将“parentId”添加到“子”中,这样​​您就可以查询“子”集合,只选择与父项匹配的文档,或者根据需要“反向填充”。

或者您可以使用"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存储解决方案来实现它所提供的功能的好处,那么将会产生成本。正如他们所说的那样,他们选择合适的工具,并以正确的方式使用。

答案 1 :(得分:0)

假设您知道演员 Jason Statham 的ID。您所要做的就是找到一部电影,其中演员身份54f38bd9b814dca762778032是杰森·斯坦森的_id。这是一个例子。

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

你的电影架构应该是这样的。

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

我希望这对你有所帮助。