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

时间:2013-11-17 15:16:18

标签: java arrays mongodb increment

我无法编写代码,它可以增加数组中不存在的值。

让我们考虑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创建属性的能力。

1 个答案:

答案 0 :(得分:1)

使用此架构,您无法实现所需的一步。

但是,如果您使用tag_name作为键名而不是使用ratings,则可以执行此操作,但查询时可能会遇到其他问题。

如果tag_name值是字段名称(替换评级),则您可以使用{"dubstep":{"0":1}}代替{ "ratings" : {"0" : 1},"tag_name" : "dubstep"},您可以按照自己的方式动态更新。请记住,此架构会使查询更加困难 - 您必须事先知道评级是什么才能通过键名进行查询。