我在工作中讨论了1对N关系中的双向引用。 According to this post in MongoDB blog,你可以做到。我们根本不需要原子更新,所以没有问题。按照文章中的例子,在我们的例子中,您只能创建或删除任务,但不能更改任务所有者。在Mongo中,双向引用对于1对N关系更有效吗?
我的论点是双向的引用可能是从双方读取数据更有效,因为我们需要他们的任务和较少只是任务往往显示刷卡,在程序的不同部分。我的同事说不会有效率提高,数据重复也不值得。
你有关于这种方法的效率的任何信息?
我在工作中讨论了1对N关系中的双向引用。 According to this post in MongoDB blog,你可以做到。我们根本不需要原子更新,所以没有问题。按照文章中的例子,在我们的例子中,您只能创建或删除任务,但不能更改任务所有者。在Mongo中,双向引用对于1对N关系更有效吗?
我的论点是双向的引用可能是从双方读取数据更有效,因为我们需要他们的任务和较少只是任务往往显示刷卡,在程序的不同部分。我的同事说不会有效率提高,数据重复也不值得。
你有关于这种方法的效率的任何信息?
取消规范化和存储数据有助于减少写入和更多读取操作。这里效率取决于数据的检索方式。如果我们从集合中检索数据需要双向引用,并且我们已经拥有它,那么肯定会提高查询的效率。
学生收集
{ _id:1, name: "Joseph", courses:[1, 3, 4]}
{ _id:2, name: "Mary", courses:[1, 3]}
{ _id:3, name: "Catherine", courses:[1, 2, 4]}
{ _id:4, name: "Robert", courses:[2, 4]}
场收集
{ _id:1, name: "Math101", students: [1, 2, 3]}
{ _id:2, name: "Science101", students: [3, 4]}
{ _id:3, name: "History101", students: [1, 2]}
{ _id:4, name: "Astronomy101", students: [1, 3, 4]}
考虑学生和课程上面的例子,这里双向引用完成后,课程数组中的学生集合给我们学生学习的不同课程。同样,课程集合中的学生阵列为我们提供了正在研究相应课程的学生。
如果我们要列出谁正在研究Math101学生那么查询将
db.courses.aggregate([{$match: {name:"Math101"}},
{$unwind:"$students"},
{$lookup:{from:"students",
localField:"students",
foreignField:"_id",
as:"result"}}])
$match,$unwind,$lookup在聚合管道来实现的结果。 $匹配来减少数据(在聚合流水线开始时使用此运算符是很好的做法),$展开展开Courses集合中的学生数组,$ $查找以查找学生集合并获取学生详细信息
在我们的样本集合执行上述聚集查询后的结果是
{
"_id" : 1,
"name" : "Math101",
"students" : 1,
"result" : [
{
"_id" : 1,
"name" : "Joseph",
"courses" : [
1,
3,
4
]
}
]
}
{
"_id" : 1,
"name" : "Math101",
"students" : 2,
"result" : [
{
"_id" : 2,
"name" : "Mary",
"courses" : [
1,
3
]
}
]
}
{
"_id" : 1,
"name" : "Math101",
"students" : 3,
"result" : [
{
"_id" : 3,
"name" : "Catherine",
"courses" : [
1,
2,
4
]
}
]
}
对双向效率引用纯粹基于我们检索,因此设计您的架构紧密地与您预期的结果一致。