我是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,只是为了这个任务。谢谢!
答案 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
设置为该值。