Node.js 使用MongoDB嵌套和查询文档
我的数据结构大致如下所示:Node.js 使用MongoDB嵌套和查询文档,node.js,mongodb,mongoose,document-database,odm,Node.js,Mongodb,Mongoose,Document Database,Odm,我的数据结构大致如下所示: var city = { name: String, mayor: Person, citizens: [Person] }; 我认为我的用例非常适合使用MongoDB,但我有几个问题。上面的模型已经用mongoose实现了,我用它在城市里筑巢。显然,citizens数组可能会很长,这就是为什么MongoDB看起来是个不错的选择 这是构建数据结构的有效方法吗?我想知道,每当我想选择一个城市时,Mongo是否需要做某种形式的加入,包括所有的市民(或大部分市
var city = {
name: String,
mayor: Person,
citizens: [Person]
};
我认为我的用例非常适合使用MongoDB,但我有几个问题。上面的模型已经用mongoose实现了,我用它在城市里筑巢。显然,citizens数组可能会很长,这就是为什么MongoDB看起来是个不错的选择
这是构建数据结构的有效方法吗?我想知道,每当我想选择一个城市时,Mongo是否需要做某种形式的加入,包括所有的市民(或大部分市民)。这显然会破坏使用文档数据库的目的
另外,在mongo终端中,我尝试了类似于db.cities.find({name:'Berlin'}).mayor的方法,但没有得到任何结果。当我尝试db.cities.find({name:'Berlin'})
时,它显示城市,还显示市长的对象id,但不是市长/个人的所有属性
那么我如何查询子文档,这是一种好的工作方式吗?我建议您使用以下模式。MongoDB中没有连接
,但有时我们仍然希望引用其他集合中的文档。这就是人口的来源
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);
通过查询柏林等城市
City.find({name: 'Berlin'})
.populate('mayor')
.populate('citizens')
.exec(...)
将从数据库中检索市长
和公民
相关文档
如果您担心城市中有太多的公民
,无法使城市
过大,而城市
中的人
,则另一个选项是
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);
要使用查询城市柏林
,以下是示例代码
City.find({name: 'Berlin'})
.populate('mayor')
.exec(function(err, city) {
Person.aggregate([
{$group: {cityId: city._id, citizens: {$push: '$name'}}}
// ...
], function(err, result) {
//...
});