有 2 个集合“ Actor ”和“电影”
1 个 Actor 的示例:
{
_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
谢谢
最佳答案
这称为请求“加入”,这是 MongoDB 无法做到的。
您可以使用数组 .filter()
在运行后的代码中 .populate()
,但当然需要首先拉动“一切”。您甚至可以指定对 .populate()
的查询来匹配您的条件。但这仍然意味着选择所有的 parent 。
您还可以将“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 存储解决方案来获得其应提供的功能的好处,那么就会产生成本。正如他们所说,马为类(class),所以选择正确的工具并以正确的方式使用。
关于javascript - 查询引用文档的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28890752/