Я считаю, что это самый быстрый запрос, который отвечает на ваш вопрос, потому что он не использует интерпретированное предложение $where
:
{$nor: [
{name: {$exists: false}},
{name: {$size: 0}},
{name: {$size: 1}}
]}
Это означает «все документы, кроме тех, которые не имеют имени (либо несуществующий или пустой массив) или с одним именем. "
Тест:
> db.test.save({})
> db.test.save({name: []})
> db.test.save({name: ['George']})
> db.test.save({name: ['George', 'Raymond']})
> db.test.save({name: ['George', 'Raymond', 'Richard']})
> db.test.save({name: ['George', 'Raymond', 'Richard', 'Martin']})
> db.test.find({$nor: [{name: {$exists: false}}, {name: {$size: 0}}, {name: {$size: 1}}]})
{ "_id" : ObjectId("511907e3fb13145a3d2e225b"), "name" : [ "George", "Raymond" ] }
{ "_id" : ObjectId("511907e3fb13145a3d2e225c"), "name" : [ "George", "Raymond", "Richard" ] }
{ "_id" : ObjectId("511907e3fb13145a3d2e225d"), "name" : [ "George", "Raymond", "Richard", "Martin" ] }
>
Используйте значение вещественного числа в качестве приоритета. Можно всегда скользить в значении между двумя существующими значениями с чем-то как newPri = task1Pri + (task2Pri - task1Pri)/2
где Task1 имеет более низкое приоритетное числовое значение (который является, вероятно, выше piority).
Corin указывает, что минута и макс. приоритеты должны были бы быть вычислены для задач, вставленных наверху или нижняя часть списка приоритетов.
И joelhardi напоминает нам, что процесс переупорядочивания является хорошей идеей время от времени очищать таблицу.
Вместо того, чтобы создать пронумерованный столбец как Вы сказал, создайте поле, названное чем-то как родитель. Каждая строка содержит pk своего родительского элемента. Когда Вы хотите переместиться, один объект вниз просто изменяют его родителя pk на нового и объект (объекты), которые ссылаются на него в их родителе pk. Думайте отдельно связанные списки.
Я присвоил бы только небольшое количество значений (1.. 10) и затем Приоритет ORDER BY DESC, DateCreated ASC. Если у Вас должны быть различные приоритеты для каждой задачи, необходимо ОБНОВИТЬ, ГДЕ Приоритет> xxx как Вы сказал.
Мне нравится ответ Kevin лучше всего, но если Вы хотите быстрое-и-грязное решение, просто сделайте это способ, которым Вы уже описали, но вместо того, чтобы увеличить 1, инкремент 10 или 100... теми путями, если необходимо повторно присваивать приоритет, у Вас есть некоторое пространство для маневра между задачами.
если никакие две задачи не могут иметь тот же приоритет затем, я думаю, именно это необходимо сделать. Но у Вас могли быть приоритет и datemodified столбец и просто вид и получить правильный порядок на основе приоритета и последнего обновления, если Вы позволяете приоритету быть дублированным.