【问题标题】:mongoDB: $inc of a nonexistent document in an arraymongoDB:数组中不存在的文档的 $inc
【发布时间】: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


【解决方案1】:

使用此架构,您无法通过一步实现您想要的。

但是,如果您使用tag_name 作为键名而不是在此处使用ratings,则可以这样做,但是在查询时您可能会遇到不同的问题。

如果 tag_name 值是字段名称(替换评级),您将拥有 {"dubstep":{"0":1}} 而不是 { "ratings" : {"0" : 1},"tag_name" : "dubstep"},您可以按照您想要的方式动态更新。请记住,此架构会使查询变得更加困难 - 您必须提前知道评级是什么才能通过键名进行查询。

【讨论】:

    猜你喜欢
    • 2021-08-19
    • 2021-07-01
    • 1970-01-01
    • 2018-01-26
    • 2016-12-15
    • 2020-09-05
    • 2016-09-10
    • 2018-12-11
    相关资源
    最近更新 更多