2017-09-25 49 views
0

我在工作中讨论了1对N关系中的双向引用。 According to this post in MongoDB blog,你可以做到。我们根本不需要原子更新,所以没有问题。按照文章中的例子,在我们的例子中,您只能创建或删除任务,但不能更改任务所有者。在Mongo中,双向引用对于1对N关系更有效吗?

我的论点是双向的引用可能是从双方读取数据更有效,因为我们需要他们的任务和较少只是任务往往显示刷卡,在程序的不同部分。我的同事说不会有效率提高,数据重复也不值得。

你有关于这种方法的效率的任何信息?

回答

0

取消规范化和存储数据有助于减少写入和更多读取操作。这里效率取决于数据的检索方式。如果我们从集合中检索数据需要双向引用,并且我们已经拥有它,那么肯定会提高查​​询的效率。

学生收集

{ _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 
         ] 
       } 
     ] 
} 

对双向效率引用纯粹基于我们检索,因此设计您的架构紧密地与您预期的结果一致。

相关问题