如何在mongodb中插入带有引用文档的文档

时间:2015-05-27 19:28:43

标签: mongodb

我有这两份文件:

Contry {
    code : integer
    name: string
}

State {
    code : integer
    name: string
    contry: DBRef to Contry
}

我这样做,为该国家/地区插入一个Contry和一个州(使用mongo shell):

// insert a new country
db.country.insert({ code : 1, name: 'Brasil' });

// find the country by code
var brasilId = db.country.find({ code : { $eq: 1} }).toArray()[0]._id;

// create a DBRef object for that country
var brasilRef = { $ref: 'country', $id: brasilId };

// insert the state referencing the country
db.state.insert({ code : 1, state: 'SC', country: brasilRef });

这是正确的吗?

有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

来自the doc

  

MongoDB应用程序使用两种方法之一来关联文档:

     
      
  • Manual references您将另一个文档中的一个文档的_id字段另存为参考。然后您的应用程序可以运行第二个查询以返回相关数据。对于大多数用例,这些引用很简单,也很充分。

  •   
  • DBRefs是使用第一个文档的_id字段,集合名称以及(可选)其数据库名称的值从一个文档到另一个文档的引用。通过包含这些名称,DBRefs允许位于多个集合中的文档更容易与单个集合中的文档链接。

  •   

此处,由于您的国家/地区代码始终与country集合中的条目相关,因此您不需要 DBRef。另外,如果我假设code唯一的键(事实上你的_id?),你可以简单地使用:

db.country.insert({ code : 1, name: 'Brasil' });
db.state.insert({ code : 1, state: 'SC', country: 1 });
//                                                ^
//                                  a reference to country with code 1

话虽如此,根据您的使用案例,使用适当的ObjectId可能是一个更好的主意:

oid = ObjectId()
db.country.insert({ _id: oid, code : 1, name: 'Brasil' });
db.state.insert({ code : 1, state: 'SC', country: oid });

答案 1 :(得分:1)

解决使用:

var countryId = Object();
db.country.insert({ _id: countryId, code: 1, name: 'Brasil' });
db.state.insert({ code: 1, name: 'SC', contry : { $ref: 'country', $id: countryId } });