javascript - 持久化对象之间的 MongoDB 原型(prototype)继承

标签 javascript node.js mongodb mongodb-query

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

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

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

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

所以新对象将变成这样:

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

正如您所看到的,这里有重复的数据(即 name 和 lastName 属性)。

我想做的是只保存差异,这样对象就会位于电子邮件 Prop 上,并像这样重新引用原始对象

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

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

这样的事情可以开箱即用吗(我的意思是 mongo 是否支持并优化这样的事情)? (或者通过一些像 Mongoose 之类的库)

或者我必须自己实现它吗?

干杯, 布吉

最佳答案

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

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

这就是更新通常的工作方式。您可以使用 update operator 而不是替换整个文档。相反,只修改您需要的部分。

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

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

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

关于javascript - 持久化对象之间的 MongoDB 原型(prototype)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26399711/

相关文章:

javascript - mongodb 的结果为 null,但 if (!result) 未捕获它

javascript - 正则表达式:如何重复模式匹配?

javascript - 如何在前端代码中检索服务器端设置的cookie?

JavaScript 描述符 : enumerable/configurable/writable are not true by default?

javascript - 如何从 .ejs 获取值到 javascript 文件

javascript - 使用 Nodejs 进行网页抓取

javascript - MongoDB "Failed to query for documents to update ... unable to decode message length: EOF"

java - mongoclientoptions 与 mongoclientsettings 之间的区别

javascript - 动态返回已执行了多少代码的函数?

javascript - 如何将表单从 html 发布到 php