Если вы воспользуетесь схемой выше, у вас возникнут проблемы с атомарным обновлением элементов с уровнем вложенности> 1. Вы можете обновить любой документ, находящийся на уровне 1 вложенности, следующим образом:
db.items.update({_id: 1, Children.ID: 2 }, {Children.$.Name: "b"},false,false);
Нодля уровня вложенности = 2 вы не можете сделать это, потому что позиционный оператор не поддерживает его сейчас (но я думаю, что это произойдет в будущем).
Вы наверняка всегда можете обновить весь документ, но это приведет к параллелизмупроблемы.
Существует другой подход к схеме, позволяющий избежать этого:
{
_id : 1,
Name : "root",
ParentId: null
},
{
_id : 2,
Name : "nested",
ParentId: 1
}
С помощью приведенной выше схемы вы можете легко обновить любой элемент в дереве, но вам потребуется дерево сборки на стороне клиента.У вашей схемы есть проблемы с атомарными обновлениями, но она будет работать быстрее, потому что вам не нужно строить дерево на стороне клиента и из-за встраивания обычно быстрее + подкачка страниц может быть легко выполнена.Моя схема более гибкая для обновлений, но не очень хороша для чтения.Что выбрать действительно зависит от конкретной ситуации.