【发布时间】:2012-02-10 21:45:16
【问题描述】:
我想要一个矩阵结构(一个 NxN 整数矩阵)并且我想要增加其中的值。在 MongoDb 中建模矩阵并增加它们的值的正确方法是什么?
【问题讨论】:
我想要一个矩阵结构(一个 NxN 整数矩阵)并且我想要增加其中的值。在 MongoDb 中建模矩阵并增加它们的值的正确方法是什么?
【问题讨论】:
假设我们有:
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 } }
这种方法在驱动方面应该更简单,但您需要在数据库中存储更多信息。
选择你更喜欢的。
【讨论】:
您可以使用矩阵索引作为字段名称:
{
_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, ... } }
【讨论】: