我有一个 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/