【发布时间】:2013-11-17 15:16:17
【问题描述】:
我无法编写代码来增加数组中不存在的值。
让我们考虑 mongo 集合中的以下结构。 (这不是我们使用的实际结构,但它维护了问题)
{
"_id" : ObjectId("527400e43ca8e0f79c2ce52c"),
"content" : "Blotted Science",
"tags_with_ratings" : [
{
"ratings" : {
"0" : 6154,
"1" : 4974
},
"tag_name" : "math_core"
},
{
"ratings" : {
"0" : 154,
"1" : 474,
},
"tag_name" : "progressive_metal"
}
]
}
示例问题:我们希望在该文档的 tags_with_ratings 属性中添加标签评级的增量,该标签尚未添加到数组中。例如,我们希望为 tag_name“dubstep”增加一个“0”值。
所以预期的行为是,mongo 会将这样的文档插入到“tags_with_ratings”属性中:
{
"ratings" : {
"0" : 1
},
"tag_name" : "dubstep"
}
目前,我们需要一个读取操作,它检查标签的嵌套文档是否存在。如果不是,我们将数组 tags_with_ratings 拉出来,创建一个新数组,重新添加前一个数组的值,然后在其中添加新的嵌套文档。我们不应该通过一个 upsert 操作来做到这一点,而不会发生昂贵的读取吗?
值的递增占用了 90% 的过程,其中一半以上用于读取,因为如果数组中不存在属性,我们无法使用 $inc 创建属性的能力。
【问题讨论】:
-
您无法使用此架构一步完成。如果您使用 tag_name 作为键名而不是在那里使用“ratings”,则可以,但查询时可能会遇到不同的问题。
-
在增加评分时,文档本身是否保证存在?
-
你提前知道 tag_names 还是动态的?
-
嗨,(感谢您提出质疑)tag_namese 未知。新的可以并且将在运行时创建并添加到结构中。所以不能保证文件存在。我希望它使用名称和首次为其添加的初始评级创建到数组中。 “键名”是什么意思?
-
在 json 中键值对 - { k:v } 字段的名称是键名(或字段名)。因此,如果 tag_name 值是字段名称(替换评级),您将拥有 {"dubstep":{"0":1}} ,您可以按照您想要的方式动态更新。但这使得查询变得更加困难 - 请参阅使用其他模式并有不同问题的这个问题:stackoverflow.com/questions/19996622/…
标签: java arrays mongodb increment