2012-02-10 78 views

回答

5

让我们考虑,我们有:

1 2 3 
4 5 6 
7 8 9 

您可以存储矩阵在MongoDB中以不同的方式嵌入式阵列:

1.Represent矩阵作为一维数组和存储这样的:

{ 
    _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.Store矩阵方式如下:

{ 
    _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 } } 

这种方法应该是从驾驶员侧简单,但是您需要将更多信息存储在数据库中。

选择你喜欢的任何更多。

+1

我想第二个解决方案与UPSERT更新相结合,但不幸的是由文档的建议,这是行不通的。所以我在想,我可以使用配对行列的地图作为关键。在这种情况下,它可以与upsert配合使用,如果某些单元没有价值,我认为可以节省空间。这是对的吗? – Matroska 2012-02-10 22:52:49

0

你可以使用矩阵索引字段名:

这种方法的
{ 
    _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, ... } }