Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用MongoDB嵌套和查询文档_Node.js_Mongodb_Mongoose_Document Database_Odm - Fatal编程技术网

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) {
          //...
});