在mongo中创建嵌套对象的正确方法

时间:2013-03-04 22:07:22

标签: node.js mongoose

我正在尝试创建一个嵌套对象数组。我正在阅读一本书中的例子,该书执行以下操作:

      // Creates the Schema for the Features object (mimics ESRI)
      var Phone = new Schema({
          number: { type: Number, required: false },
          ...
          personId: {type: Schema.Types.ObjectId}
        }
      );

      // Creates the Schema for the Attachments object
      var Person = new Schema({   
         name: { type: String },  
         phones: [Phone]
        }
      );

  var Person = mongoose.model('Person', Person);

当为一个人存储多个Phone#时,哪个工作正常。但是我不确定是否有一种好/快的方式来通过_id获取Phone对象。由于Phone不是猫鼬模型,你不能直接去Phone.findOne({...});现在我很难通过_id找到一个人,然后循环播放那些人的电话,看看id是否匹配。

然后我偶然发现了这个链接: http://mongoosejs.com/docs/populate.html

一种方式比另一种方式更正确吗?目前,当我删除一个人时,他/她的手机也会消失。不太确定与'populate'一起使用,似乎我需要删除Person和Phones。

有人想尝试解释这些差异吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

一般规则是,如果您需要独立查询电话,那么您应该将它们保存在单独的集合中,并在需要时使用populatePeople查找它们。否则,嵌入它们通常是更好的选择,因为它简化了更新和删除。

当使用像您现在这样的嵌入式方法时,请注意Mongoose数组提供了一种id方法,您可以使用该方法通过_id值更轻松地查找元素。

var phone = person.phones.id(id);