我无法编写代码,它可以增加数组中不存在的值。
让我们考虑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创建属性的能力。
答案 0 :(得分:1)
使用此架构,您无法实现所需的一步。
但是,如果您使用tag_name
作为键名而不是使用ratings
,则可以执行此操作,但查询时可能会遇到其他问题。
如果tag_name值是字段名称(替换评级),则您可以使用{"dubstep":{"0":1}}
代替{ "ratings" : {"0" : 1},"tag_name" : "dubstep"}
,您可以按照自己的方式动态更新。请记住,此架构会使查询更加困难 - 您必须事先知道评级是什么才能通过键名进行查询。