如何在mongoDB中使用嵌入式文档结构进行多对多关系?可能吗?

时间:2014-04-24 22:35:42

标签: mongodb database-schema nosql

我有一个叫做公司的集合

 {
    _id: ObjectId("1111"),
    name: 'ABc COrp',
    address: {
        Street: '124 Main Street'
        city: 'San Diego'
        state: 'California'
        zip: "92115"
    }
    vendor: [{
            vendor_id: ObjectId("1234")

        }, {
            vendor_id: ObjectId("4567"
            }]
    }
}
// vendor collection 
{
    _id: ObjectId("1234"),
    name: 'foodCA company',
    company: [company_id: ObjectId('11111')]
}

现在我有一些供应商,如食品,办公用品等供公司使用。供应商和公司有很多关系。

当我使用嵌入式文档结构时,我可以使用dbref(http://www.mongodb.org/display/DOCS/Database+References#DatabaseReferences-DBRef)吗?

谢谢!我是mongoDB的新手。我为自己的无知道歉。

1 个答案:

答案 0 :(得分:1)

基于official documentation有两种选择:

  • DBREF
  • 手动参考。

<强> DBREF

请记住:

  

要解析DBRefs,您的应用程序必须执行其他查询   返回引用的文档。许多驱动程序都有辅助方法   自动形成DBRef的查询。司机1没有   自动将DBRef解析为文档。

由于这些人(123而我自己并没有看到使用它们的意义。此外,dbRef还允许您不仅引用另一个集合,还可以引用另一个数据库。 (我从来没有发现它有用,但这并不代表其他人没有用。)

手动参考:

我更喜欢这种方法,因为它非常简单易读。你有公司和供应商,所以

{
 companyID : 1,
 vendors: [1, 3, 19]
}

请注意,没有理由将每个供应商作为对象放置。有少量不同的供应商,你可以做:     {      companyID:1,      vendors_food:[1,3],      vendors_drinks:[17]     }

许多不同类型的供应商,而不是您可以做的事情:

{
 companyID : 1,
 vendors: [{
    'type' : 'drink',
    'id' : 18
 },{
    'type' : 'food',
    'id' : 3
 }],
}

在找到贵公司[1, 6, 29]的供应商后,您可以将它们合并,只执行一次数据库请求,以$in查找有关所有这些供应商的信息:

db.vendors.find({
  '_id': {
     $in: [1, 6, 29]
  }
});

请注意,这只是我喜欢使用mongo。