【问题标题】:Is it possible to populate a self reference in a mongoosejs schema?是否可以在 mongoosejs 模式中填充自引用?
【发布时间】:2013-04-08 09:06:52
【问题描述】:

我有一个猫鼬模型模式,我正在尝试为一些预先存在的 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" } ] } }

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

【问题讨论】:

    标签: node.js mongodb schema mongoose


    【解决方案1】:

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

    { "_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' }
            }]
        } });
    

    应该可以的。

    【讨论】:

    • 它不再是一个空集,而是现在改为files: [ undefined, undefined, undefined ]。它至少现在正在阅读参考资料,但没有填充它们。还有其他想法吗?
    • 您还需要将填充调用更新为:populate('pcap.files._id')
    • 不幸的是.populate('files').populate('pcap.files._id'),有同样的影响,我仍然以files: [ undefined, undefined, undefined ]告终。但是,.populate('pcap.files') 会引发错误TypeError: Cannot read property 'ref' of undefined。关于我缺少什么的任何想法?
    • 所以你基本上是正确的。我只需要稍微调整您的答案以使用 String 而不是 ObjectId。谢谢!
    【解决方案2】:

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

    { "_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(..)
    

    【讨论】:

      猜你喜欢
      • 2016-03-10
      • 2017-06-17
      • 1970-01-01
      • 2017-10-08
      • 2019-12-18
      • 2015-09-26
      • 2017-02-13
      • 2021-11-25
      • 1970-01-01
      相关资源
      最近更新 更多