【问题标题】:MongoDB prototypal inheritance between persisted objects持久对象之间的 MongoDB 原型继承
【发布时间】:2014-10-16 20:20:00
【问题描述】:

我很好奇 MongoDB 是否可以选择将一个对象与另一个对象(在同一架构中)一起保存为它的“原型”。例如:

假设我们在数据库中有一个像这样的对象

{
  name : 'foo',
  lastName : 'bar',
  email : 'foo_bar@baz.com'
}

我想做的是获取这个对象并更新电子邮件(例如)

所以新对象会变成这样:

{
  name: 'foo',
  lastName : 'bar',
  email : 'some_other_email@baz.com'
}

如您所见,这里有一个重复的数据(即 name 和 lastName 属性)。

我想做的是只保存差异,这样对象就会在电子邮件道具上,然后像这样引用原始对象

{
  email : 'some_other_email@baz.com',
  __proto__ : originalObjectId //or whatever
}

我知道我可以直接更新对象或保存对象的新副本,但我希望具有不变性而不是每次都保存整个对象,我只想保存与原始对象的差异。

这样的事情是否可能开箱即用(我的意思是 mongo 是否支持和优化这样的事情)? (或通过一些像猫鼬之类的库)

或者我必须自己实现它?

干杯, 布吉

【问题讨论】:

  • 你能命名一个有继承的数据库吗?我们现在谈论的是复制数据以达到最佳速度。您尝试最小化磁盘上存储的数据大小。如果你想得到一个完整的对象,你能想象要经过多少跳吗?
  • @wayne 像 PostgreSQL 这样的对象关系数据库实际上就是这样做的。

标签: javascript node.js mongodb mongodb-query


【解决方案1】:

它被称为$set 运算符,它是一个更新运算符,旨在仅修改指定的字段,因此您不必为了保留它而通过网络传递整个对象:

db.collection.update(
    { "_id": idOfObjectOrOtherQuery },
    { "$set": { "email": "some_other_email@baz.com" }
)

这就是更新通常的工作方式。与其替换整个文档,不如使用update operator 来修改您需要的部分。

MongoDB 提供了一个低级接口来更新操作,如图所示。您似乎在谈论的部分内容是在此之上的软件层,可以为您做出那些“差异”决定。这些被称为对象文档映射器或 ODM 解决方案,是对象关系映射器或 ORM 的对应物。

这不是 MongoDB 的工作,因为它应该是精益和灵活的。处理任何进一步交互的工作被认为是委托给软件库而不是服务器。因此,您会发现某些库(例如“mongoose”)完全按照所展示的方式执行。如果您修改对象,则检测到“增量”并且仅将更改发送到服务器。

因此,您可以“重新发明轮子”(我们非常欢迎您这样做),或者您可以查看已经“构建在”使用所提供的基本操作的技术的解决方案。

【讨论】:

  • 这不是我的意思。我想要一个不可变的数据库。基本上不会只插入更新,我希望不插入全新记录的选项,但只插入旧对象和新对象之间的差异。
  • @boogie 是的,你问这个的方式有点模糊。更多信息可让您了解这里正在发生的事情以及已经存在的事情。这不是 MongoDB 的工作。它不应该是。增加了复杂性。
【解决方案2】:

没有 MongoDB 不支持这个,你必须自己实现这个。

继承是对象系统的一个特性,但 MongoDB 使用恰好使用对象表示法 (BSON) 的文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-27
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 2014-11-26
    • 2012-07-14
    相关资源
    最近更新 更多