我有这两份文件:
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 });
这是正确的吗?
有更好的方法吗?
答案 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 } });