是否可以在mongoosejs模式中填充自引用?

时间:2013-04-16 04:43:12

标签: node.js mongodb schema mongoose

我有一个猫鼬模型架构,我试图为一些预先存在的mongodb文档构建。现有的mongo文档具有对同一集合的自引用。我试图创建一个表示这种关系的模式,然后尝试使用populate method。模式如下所示(为简洁起见,删除了一些属性):

var fileSchema = new Schema({
    _id: { type: String },
    pcap: {
        files: [{ type: Schema.Types.ObjectId, ref: 'Files' }]
    }
});

var file = artifactConn.model('Files', fileSchema, 'info');

然后我使用上面的模型进行查询,然后填充如下:

models.file.findById("91320684-9a1a-4f2a-a03f-63a7a208ec9b")
.populate('pcap.files') // have also tried just 'files' w/ the same result
.exec(function (err, file) {
    if (!err) {
        console.log(file);
    } else {
        console.log(err);
    }
});

导致此

{ _id: '91320684-9a1a-4f2a-a03f-63a7a208ec9b',
  pcap: 
   { files: [] }
}

如果我在mongohub中查看我的文档,它看起来像这样

{ "_id" : "91320684-9a1a-4f2a-a03f-63a7a208ec9b",
  "pcap" : {
    "files" : [ 
      { "_id" : "e4eed129-b4aa-46fc-8df2-3f3f92e6fe53" }, 
      { "_id" : "8c0ecb98-452e-475d-a521-feba5c3d1426" }, 
      { "_id" : "4b87c467-f396-4bcf-a7b0-8419e8441ec0" } ] } }

我的填充号码是否有问题?这是我的架构设置的方式吗?它是存储数据的方式吗?

2 个答案:

答案 0 :(得分:2)

您的架构不正确。您拥有的架构将匹配如下集合:

{ "_id" : "91320684-9a1a-4f2a-a03f-63a7a208ec9b",
  "pcap" : {
    "files" : [ 
      { ObjectId("e4eed129-b4aa-46fc-8df2-3f3f92e6fe53") }, 
      { ObjectId("8c0ecb98-452e-475d-a521-feba5c3d1426") }, 
      { ObjectId("4b87c467-f396-4bcf-a7b0-8419e8441ec0") } ] } }

架构应该是:

var fileSchema = new Schema({
    _id: { type: String },
    pcap: {
        files: [{ 
            _id: { type: String, ref: 'Files' }
        }]
    } });

这应该有效。

答案 1 :(得分:1)

架构看起来不错。以相同的方式存储数据,您应该做得很好:例如

{ "_id" : "91320684-9a1a-4f2a-a03f63a7a208ec9b",
  "pcap" : {
  "files" : [ ObjectId("e4eed129-b4aa-46fc-8df2-3f3f92e6fe53"), ObjectId("8c0ecb98-452e-475d-a521-feba5c3d1426"), ObjectId("4b87c467-f396-4bcf-a7b0-8419e8441ec0")] 
  } 
}

然后

Model.find(..).populate('pcap.files').exec(..)