【问题标题】:Increment matrix structure in MongoDbMongoDb中的增量矩阵结构
【发布时间】:2012-02-10 21:45:16
【问题描述】:

我想要一个矩阵结构(一个 NxN 整数矩阵)并且我想要增加其中的值。在 MongoDb 中建模矩阵并增加它们的值的正确方法是什么?

【问题讨论】:

    标签: mongodb matrix increment


    【解决方案1】:

    假设我们有:

    1 2 3
    4 5 6
    7 8 9
    

    您可以通过不同的方式将矩阵作为嵌入式数组存储在 mongodb 中:

    1.将矩阵表示为一维数组并存储如下:

    {
      _id: "1",
      matrix: [1,2,3,4,5,6,7,8,9],
      width: 3, // or store just size in case of NxN
      height: 3,
    }
    

    然后要增加矩阵的第三个元素,您将需要以下更新:

    db.matrix.update({_id: 1}, { $inc : { "matrix.2" : 1 } }
    

    这种方法非常轻量级,因为您存储尽可能少的数据,但是您将始终需要计算要更新的元素的位置,并且您需要编写额外的代码来反序列化驱动程序中的矩阵。

    2.按如下方式存储矩阵:

    {
      _id: "1",
      matrix: [
      {xy: "0-0", v: 1},
      {xy: "1-0", v: 2},
      {xy: "2-0", v: 3},
      {xy: "0-1", v: 4},
      ...
      ]
    }
    

    然后要增加矩阵中第一行的第三个元素,您将需要以下更新:

    db.matrix.update({_id: 1, "matrix.xy": 2-0 }, { $inc : { "matrix.$.v" : 1 } }
    

    这种方法在驱动方面应该更简单,但您需要在数据库中存储更多信息。

    选择你更喜欢的。

    【讨论】:

    • 我尝试将第二个解决方案与带有 upsert 的更新结合起来,但不幸的是,正如文档所建议的那样,它不起作用。所以我想我可以使用以对行列作为键的映射。在这种情况下,它可以与 upsert 一起使用,我认为如果某些单元格没有价值,我可以节省空间。对吗?
    【解决方案2】:

    您可以使用矩阵索引作为字段名称:

    {
      _id: "1",
      matrix: {
      "0": {{"0": 0}, {"1": 0}, {"2": 0}}
      "1": {{"0": 0}, {"1": 0}, {"2": 0}},
      "2": {{"0": 0}, {"1": 0}, {"2": 0}},
      "3": {{"0": 0}, {"1": 0}, {"2": 0}},
      ...
      ]
    }
    

    这种方法的一个优点是您不必初始化矩阵,因为$inc 将创建字段并为其分配您要增加的值。

    您还可以使用upsert=true一次更新多个字段或创建不存在的文档。

    最后,更新的符号非常简洁:

    db.matrix.update({_id: 1}, { $inc : { "matrix.0.0" : 1, "matrix.0.1" : 2, ...  } }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-11
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多