有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
由于
答案 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
});
我希望这对你有所帮助。