Желаемое поведение
Я пытаюсь обновить свойство position
каждого объекта в массиве объектов при изменении одной из их позиций. Например, объект с позицией 5
перемещается в позицию 0
, поэтому позиции других объектов также должны меняться.
Мне не удалось найти «итератор массива» для MongoDB, поэтому я пытался подойти к проблеме с других точек зрения, но, думаю, я ее слишком усложняю.
Схема
statements: [
{
"position": 0,
"id": "a"
},
{
"position": 1,
"id": "t"
},
{
"position": 2,
"id": "z"
},
{
"position": 3,
"id": "q"
},
{
"position": 4,
"id": "l"
},
{
"position": 5,
"id": "b"
}
]
Сценарий внешнего интерфейса
Figure A: Starting state of ordered divs
Figure B: Changed state of ordered divs (statement
5 has been moved to position
0 )
Что я пробовал
Псевдокод
Я думаю, что логика может быть выражена как:
Положение объектов изменится от old_position к
new_position на произвольное количество мест.
Если reposition_direction задом наперед, все объекты с положением
больше или равно new_position, должно увеличиваться (кроме
перемещаемый объект, которому должна быть назначена новая_позиция)
Если reposition_direction вперед, все объекты с положением
меньше или равно new_position должно уменьшаться (кроме
перемещаемый объект, которому должна быть назначена новая_позиция)
( обновление : эта логика неверна, рабочая логика добавлена в ответ)
Это то, что у меня есть до сих пор:
if (reposition_direction === "backwards") {
var new_filter = { _id: o_id, "statements.position": { $gte: new_position } };
var new_update = { $inc: { "statements.$[elem].position": 1 } };
var array_filters = { "arrayFilters": [{ "elem.position": { $gte: new_position } }], "multi": true };
} else if (reposition_direction === "forwards") {
var new_filter = { _id: o_id, "statements.position": { $lte: new_position } };
var new_update = { $inc: { "statements.$[elem].position": -1 } };
var array_filters = { "arrayFilters": [{ "elem.position": { $lte: new_position } }], "multi": true };
}
collection.updateOne(new_filter, new_update, array_filters, function(err, doc) {
if (err) {
res.send(err);
} else {
res.json({ response: "hurrah" });
}
});