MongoDB"加入" (1对多和多对多手动参考?)需要帮助。没有入侵的方法

时间:2015-06-13 10:43:12

标签: mongodb

我是MongoDB的新手,我在MySQL中知道很多东西。我在RoboMongo工作。

我们说我有两个系列: 仪器:

db.createCollection('Instruments');
db.Instruments.insert(
[{
    instrumentID : 1,
    instrumentName : "Squier",
    instrumentManufacturerID : 3,
    instrumentMadeIn: 'someCountry'
},{
...
])

和制造商:

db.createCollection('Manufacturers')
db.Manufacturers.insert([
{
     manufactID : 1,
     manufactName : 'Fender',
     manufactCountry : 'United States',
     manufactFounded : 1946
},{
...
])

我想" SELECT" (找?)制造商的工具'国家是美国的' ......我希望"更新"所有的Fender'仪器' instrumentMadeIn国家/地区'日本'

我不想在每台仪器内嵌入ManufacturerInformation,因为重复使用相同的信息烤箱,而且又浪费时间和空间。

我看到了一些代码,其中ID字段被称为' _id'并有一个大的对象值。它必须对引用做一些事情,不确定。

我只想要一些简单的代码来实现我的目标,不需要大量的解释,也许是一些简短的解释,但这就是我所要求的。我永远不会使用MongoDB,只是为了这个任务。谢谢!

1 个答案:

答案 0 :(得分:1)

MongoDB是一个文档数据库,而不是关系数据库。它没有做JOIN。依赖于集合之间的“JOIN”来执行其基本操作的模式不适合文档数据库,应该非规范化为具有嵌入数据的单个集合。当你对此感到icky时,你应该考虑使用关系数据库。

当您必须执行此类操作时,您需要通过运行多个查询在客户端执行此操作。您没有指定编写应用程序的编程语言,因此我将解释如何在mongo shell中执行此操作。

// get the id of Fender
var manufacturerId = db.Manufacturers.findOne({"manufactName" : "Fender",}).manufactID;
// update all instruments with that manufacturer ID which are made in japan
db.Instruments.update(
    { "instrumentManufacturerID" : manufacturerId, "instrumentMadeIn": "Japan" },
    { $set: { "foo":"bar"}},
    { multi:true }
);

是的,对于这样一个简单的操作你需要两个查询是丑陋和缓慢的,但这就是你尝试使用螺丝刀作为锤子时所得到的。

关于_id字段的问题:每个文档都会自动获取此字段,当自动设置该字段时,它将设置为(实际上)全局唯一的ObjectId。您可以将其用作文档的唯一ID,但您不必这样做。当您的数据已有唯一键时,您也可以自己将_id设置为该值。