Инкрементная матричная структура в MongoDb - PullRequest
4 голосов
/ 11 февраля 2012

Я хотел бы иметь матричную структуру (целочисленную матрицу NxN), и я хочу увеличить значения в ней. Каков правильный подход для моделирования матрицы в MongoDb и для увеличения их значений?

Ответы [ 2 ]

5 голосов
/ 11 февраля 2012

Давайте рассмотрим, что у нас есть:

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

Этот подход должен быть проще со стороны водителя, но вам нужно будет хранить больше информации в базе данных.

Выбирай, что тебе больше нравится.

0 голосов
/ 03 декабря 2015

Вы можете использовать матричные индексы в качестве имен полей:

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