【问题标题】:Does MongoDB store links or copies for related documentsMongoDB 是否存储相关文档的链接或副本
【发布时间】:2012-07-18 11:10:49
【问题描述】:

使用猫鼬和 NodeJS,假设我有一个“汽车”和一个“车轮”模式。这辆车存储了一系列轮子。

var Wheel = new Schema({
    color : { type: String },
    timestamp : { type: Date }
});

var Car = new Schema({
    wheels : [Wheel],
    timestamp : { type: Date }
});

汽车文档是否包含这些车轮的静态副本,或者是否将车轮存储为链接(这将在查找时反映车轮的最新状态,即使车轮在汽车创建后发生了变化)。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    这里模式设计的广泛选择是embedding versus linking。这两者都是通过使用约定实现的,在服务器实现意义上并不是真正的“功能”(即 MongoDB 2.0 服务器没有实现任何引用或关系查找功能)。

    要明确条款:

    • 嵌入是在 BSON 文档中嵌套对象和数组。

    • 链接(又名Database ReferencesDBRefs)是文档之间的引用。

    如果您嵌入,就像在您的原始示例中一样,那么您已经创建了一个子文档(或者如您所描述的,一个“静态副本”)。与存储在其他地方的信息没有关系。

    如果您链接,您正在添加一个引用,该引用是另一个集合中文档的主键。如果您想将此引用合并到文档中,则需要额外的数据库查询。根据您使用的客户端驱动程序,可能会有帮助程序自动执行此操作;您也可以手动进行相同的查找。

    【讨论】:

      【解决方案2】:

      我正在以另一种方式做到这一点:

      var Car = new Schema({
          wheels : [Schema.ObjectId],
          timestamp : { type: Date }
      });
      

      然后假设我有 4 个轮子和一辆汽车,我这样做:

      car.wheels.push(wheel1._id);
      car.wheels.push(wheel2._id);
      car.wheels.push(wheel3._id);
      car.wheels.push(wheel4._id);
      

      我认为 Wheels 需要先保存,才能拥有 _id 属性。

      然后在 MongoDB 中,属性 Car.wheels 是一个 ObjectID 数组(因此是对轮子的引用),我可以在 Javascript 中做到这一点。

      car.wheels[0].color
      

      我想它会以与您的架构相同的方式工作。

      【讨论】:

        【解决方案3】:

        我猜在你的情况下,它是汽车中的静态车轮。要使用参考,请将 dbref 用作:

        var Car = new Schema({
        wheels : [ { type : Schema.ObjectId, ref : 'Wheel' } ],
        timestamp : { type: Date } });

        【讨论】:

          猜你喜欢
          • 2023-03-18
          • 1970-01-01
          • 2012-11-21
          • 1970-01-01
          • 2015-06-20
          • 1970-01-01
          • 2015-03-26
          • 1970-01-01
          • 2015-09-05
          相关资源
          最近更新 更多