使用 MongoDB 嵌套和查询文档
Nesting and querying documents with MongoDB
我的数据结构大致如下所示:
var city = {
name: String,
mayor: Person,
citizens: [Person]
};
我认为我的用例非常适合使用 MongoDB,但我有几个问题。上面的模型是用 mongoose 实现的,我使用 sub documents 将 Persons 嵌套在 City.Obviously 中,公民数组可能会变得很长,这就是为什么 MongoDB 看起来像不错的选择。
这是构建我的数据的有效方式吗?我想知道每次我想 select 一个城市时 Mongo 是否必须做某种加入,其中 所有 的公民(或大部分其中)。这显然会破坏使用文档数据库的目的。
此外,当我在 mongo 终端中尝试类似 db.cities.find({name:'Berlin'}).mayor
的操作时,我没有得到任何结果。当我尝试 db.cities.find({name:'Berlin'})
它显示了城市,它还显示了市长的对象 ID 但不是 mayer/Person.
的所有属性
那么如何查询 和 子文档,这是一种好的工作方式吗?
我会推荐您的架构,如下所示 Populate
。 MongoDB 中没有 joins
但有时我们仍然希望引用其他集合中的文档。这就是人口的来源。
var personSchema = Schema({
_id : Number,
name : String,
});
var Person = mongoose.model('Person', personSchema);
var citySchema = Schema{
name: String,
mayor: { type: Schema.Types.ObjectId, ref: 'Person' },
citizens: [{ type: Schema.Types.ObjectId, ref: 'Person' }]
};
var City = mongoose.model('City', citySchema);
通过
查询城市Berlin
City.find({name: 'Berlin'})
.populate('mayor')
.populate('citizens')
.exec(...)
将从数据库中检索 mayor
和 citizens
相关文档。
如果您担心城市中的 citizens
太多而 city
与 city
中的人 populate
太大,另一种选择是
var personSchema = Schema({
_id : Number,
name : String,
cityId : { type: Schema.Types.ObjectId, ref: 'City' }
});
var Person = mongoose.model('Person', personSchema);
var citySchema = Schema{
name: String,
mayor: { type: Schema.Types.ObjectId, ref: 'Person' }
};
var City = mongoose.model('City', citySchema);
要用aggregation
查询城市Berlin
,这里是示例代码。
City.find({name: 'Berlin'})
.populate('mayor')
.exec(function(err, city) {
Person.aggregate([
{$group: {cityId: city._id, citizens: {$push: '$name'}}}
// ...
], function(err, result) {
//...
});
我的数据结构大致如下所示:
var city = {
name: String,
mayor: Person,
citizens: [Person]
};
我认为我的用例非常适合使用 MongoDB,但我有几个问题。上面的模型是用 mongoose 实现的,我使用 sub documents 将 Persons 嵌套在 City.Obviously 中,公民数组可能会变得很长,这就是为什么 MongoDB 看起来像不错的选择。
这是构建我的数据的有效方式吗?我想知道每次我想 select 一个城市时 Mongo 是否必须做某种加入,其中 所有 的公民(或大部分其中)。这显然会破坏使用文档数据库的目的。
此外,当我在 mongo 终端中尝试类似 db.cities.find({name:'Berlin'}).mayor
的操作时,我没有得到任何结果。当我尝试 db.cities.find({name:'Berlin'})
它显示了城市,它还显示了市长的对象 ID 但不是 mayer/Person.
那么如何查询 和 子文档,这是一种好的工作方式吗?
我会推荐您的架构,如下所示 Populate
。 MongoDB 中没有 joins
但有时我们仍然希望引用其他集合中的文档。这就是人口的来源。
var personSchema = Schema({
_id : Number,
name : String,
});
var Person = mongoose.model('Person', personSchema);
var citySchema = Schema{
name: String,
mayor: { type: Schema.Types.ObjectId, ref: 'Person' },
citizens: [{ type: Schema.Types.ObjectId, ref: 'Person' }]
};
var City = mongoose.model('City', citySchema);
通过
查询城市Berlin
City.find({name: 'Berlin'})
.populate('mayor')
.populate('citizens')
.exec(...)
将从数据库中检索 mayor
和 citizens
相关文档。
如果您担心城市中的 citizens
太多而 city
与 city
中的人 populate
太大,另一种选择是
var personSchema = Schema({
_id : Number,
name : String,
cityId : { type: Schema.Types.ObjectId, ref: 'City' }
});
var Person = mongoose.model('Person', personSchema);
var citySchema = Schema{
name: String,
mayor: { type: Schema.Types.ObjectId, ref: 'Person' }
};
var City = mongoose.model('City', citySchema);
要用aggregation
查询城市Berlin
,这里是示例代码。
City.find({name: 'Berlin'})
.populate('mayor')
.exec(function(err, city) {
Person.aggregate([
{$group: {cityId: city._id, citizens: {$push: '$name'}}}
// ...
], function(err, result) {
//...
});