mongoDB:数组中不存在的文档的$ inc

我无法编写代码,这将能够增加数组中不存在的值。

让我们考虑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_name值是字段名称(替换评级),则您有{"dubstep":{"0":1}}而不是{ "ratings" : {"0" : 1},"tag_name" : "dubstep"}你可以按照你想要的方式动态更新。 请记住,此架构将使查询更加困难 – 您必须事先知道评级是什么才能通过keyname进行查询。