在MongoDB中查找具有密钥集的文档

在MongoDB中查找具有密钥集的文档,mongodb,Mongodb,假设MongoDB有两个集合A和B,其中A有一个引用B列表的属性: A: B: 对于给定的a,从B获取所有“数据”更好的方法是: a) 从a中读取数组itemB,do.find({u id:x})中的每个元素x b) 从A,do.find({u-id:{$in:[x1,x2,…]})中读取数组项b 还是有更好的方法来模拟这一点? 将其分为A和B的原因是B.info可以有很多项,或者B.data可以非常长。这意味着将B嵌入到A中可能会因为最大文档大小而导致性能问题。最好的方法是以“其他方式”存储关

假设MongoDB有两个集合A和B,其中A有一个引用B列表的属性:

A:

B:

对于给定的a,从B获取所有“数据”更好的方法是:

a) 从a中读取数组itemB,do.find({u id:x})中的每个元素x

b) 从A,do.find({u-id:{$in:[x1,x2,…]})中读取数组项b

还是有更好的方法来模拟这一点?
将其分为A和B的原因是B.info可以有很多项,或者B.data可以非常长。这意味着将B嵌入到A中可能会因为最大文档大小而导致性能问题。

最好的方法是以“其他方式”存储关系:

A:

B:

然后,您可以简单地查询:

db.B.find( { itemA: … } );
如果itemA是数组,则此查询也将起作用:

 {
   _id: ObjectId
   data : String 
   info : [String]
   itemA: [ ObjectId, ObjectId, … ]
 }

在MongoDB中,与关系数据库相比,您倾向于将“外键”存储在另一端。

我看到了其中的动机。然而,在我的例子中,B与单个a没有关联,它可以是1:n或n:m关系。相反,A1有一个Bs列表,A2有另一个Bs列表。在您的情况下,B也将与单个a关联?是的,在我的示例中是这样的。但是itemA也可以很容易地成为一个数组,并且查询仍然可以工作。我已经将它添加到我的答案中。是的,这很有效。但基本上,我的问题是相反的。它的实际用法是:对于给定的a,查找所有链接的B文档。对于给定的B,查找所有链接的a文档。-首先,我可以使用您的查询。对于第二种情况,我可以读取itemA数组,然后使用其中的id来查找每个文档。但这是我最初的问题:在我的问题(a或b)中,我的选择哪一个更好,或者根本不重要?
 {
   _id: ObjectId
   name : String
 }
 {
   _id: ObjectId
   data : String 
   info : [String]
   itemA: ObjectId
 }
db.B.find( { itemA: … } );
 {
   _id: ObjectId
   data : String 
   info : [String]
   itemA: [ ObjectId, ObjectId, … ]
 }