ruby-on-rails - mongoid 使用相同的 mongo "_id"创建 2 个嵌入式文档

标签 ruby-on-rails ruby mongodb mongoid

我有一个 mongodb 记录,其中一个字段是两个相同的嵌入式文档的数组(甚至“_id”相同)是否有意义。

我在使用mongoid创建记录的时候遇到了这个问题。我不太了解 mongoid 的嵌入式文档实现,但我想如果这些嵌入式文档是“文档”,那么它们都不应该有一个已经被另一个文档使用的“_id”。

我得到的例子:

{
   _id: "123",
   name: "sylvain",
   friends: [ ]
},
{
   _id: "245",
   name: "sonia",
   friends: [ {
      _id: 123,
      name: "sylvain"
   },
   {
      _id: 123,
      name: "sylvain"
   } ]
},
{
   _id: "456",
   name: "bob",
   friends: [ {
      _id: 123,
      name: "sylvain"
   } ]
}

最佳答案

为了说清楚:

  • _id 字段在集合的每个 文档上都是必需的。它用于唯一识别您的文档。将其视为您收藏的主键。该 _id 字段总是有一个索引。
  • 通常,嵌入文档没有唯一标识符(它们根本不需要那个:嵌入文档实际上是它们父文档的一部分——这不是查看两个“联合”集合)。
  • 但是,例如,您可以在嵌入式文档中添加一个 id 字段作为外键。即使这可能相当困惑,您甚至可以根据需要将其称为 _id。但是,它在该上下文中没有任何特殊含义。

由于 NoSQL 数据库倾向于使用非规范化模式,因此在 MongoDB 中将相同的文档嵌入到不同的根文档中是很常见的。事实上,这是表示多对多关系的一种方式。


这是一个完全有效的示例(即使如我之前所说,使用 _id 作为字段名称乍一看可能会造成混淆):

{
   _id: "123",
   name: "sylvain",
   friends: [ ]
},
{
   _id: "245",
   name: "sonia",
   friends: [ {
      _id: 123,
      name: "sylvain"
   } ]
},
{
   _id: "456",
   name: "bob",
   friends: [ {
      _id: 123,
      name: "sylvain"
   } ]
}


关于将两个 相同的文档嵌入到相同 父文档中:这可能是一种“计算”从父文档到子文档的引用次数的方法。将您的父子文档关系想象成一张图。您很可能有两个从一个节点到另一个节点的链接——另一方面,人们会考虑向嵌入文档添加一些“权重”字段(因此,限定链接)。根据您的用例,这两种解决方案可能各有利弊。

这是一个使用两个不同模型表示以下事实的示例:

"The customer sylvain currently hold two coupons for a free MP3 download on our store"

// customer
{
   _id: "123",
   name: "sylvain",
   coupons: [ {
        _id: 9905,
        desc: "Free MP3 download"
   },
   {
        _id: 9905,
        desc: "Free MP3 download"
   } ]
}

或者,人们可能更倾向于这样想:

// customer
{
   _id: "123",
   name: "sylvain",
   coupons: [ {
        _id: 9905,
        desc: "Free MP3 download",
        qty: 2
   } ]
}

就我自己而言,我认为后者是否真的比前者好并不那么明显。例如,在后一种情况下,当客户使用优惠券时,您将不得不减少数量——如果 qty == 0 则移除优惠券。似乎比前一种情况需要更多的工作。但是 YMMV。

关于ruby-on-rails - mongoid 使用相同的 mongo "_id"创建 2 个嵌入式文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30076684/

相关文章:

ruby - 用散列中的值替换键

mongodb - Mongo连接被拒绝ECONNREFUSED

ruby-on-rails - Rails 页面缓存和自动扩展的问题

ruby-on-rails - Ruby rails 包括?大批

ruby-on-rails - Heroku Legacy 平台停用。如何迁移?

ruby-on-rails - 范围天数从上次部署日期开始计算

ruby - 优化范围如何工作?

ruby 诅咒 : How to get ctrl/meta keys with

mongodb 3.4.2 InvalidIndexSpecificationOption错误: The field 'unique' is not valid for an _id index specification

javascript - Meteorjs 集合通过 $where 查找