MongoDB порядок по "номеру" по возрастанию - PullRequest
3 голосов
/ 19 мая 2011

Я пытаюсь создать регистрационную форму с помощью mongoose и MongoDB.У меня есть уникальный ключ UserId, и каждый раз, когда я создаю новую запись, я хотел бы взять самый большой UserId в базе данных и увеличить его на единицу.Я пытался с db.user.find({}).sort({userId: 1});, но, похоже, не работает.Спасибо

Масиар

Ответы [ 2 ]

6 голосов
/ 19 мая 2011

То, что вы хотите сделать, звучит больше как схема для реляционных баз данных с автоматическим приращением. Я бы порекомендовал другое решение.

Сначала у вас уже есть уникальный идентификатор. Он создается автоматически и находится в поле "_id". Для меня кажется, что вы хотите иметь UserID для построения отношений, но вы уже можете использовать значение в _id.

Другая причина, по которой вам нужны увеличенные идентификаторы, может заключаться в том, что вы создаете веб-приложение и, вероятно, хотите иметь "более хорошие" URL-адреса? Например. / user / 1 вместо /user/abc48df...?

Если это так, я бы предпочел создать уникальное ограничение для имени пользователя. И вместо идентификатора вы используете свое имя пользователя в URL "/user/john".

С этим ваши URL намного лучше. А для построения отношений вы можете использовать _id. И вы не столкнетесь с проблемами при получении наибольшего числа первым.

Чтобы создать уникальный индекс:

db.collection.ensureIndex({username: 1}, {unique: true})
6 голосов
/ 19 мая 2011

Вы можете сделать это, чтобы получить пользователя с самым высоким текущим значением UserId:

db.user.insert( { UserId: 1 } )
db.user.insert( { UserId: 2 } )
db.user.insert( { UserId: 3 } )

db.user.find().sort( { UserId: -1 } ).limit(1)

Стоит отметить, что в MongoDB нет способа извлечь это значение и вставить нового пользователя в одну атомарную транзакцию, он поддерживает только атомарные операции с отдельными документами. Вам нужно позаботиться о том, чтобы другая операция не вставляла другого пользователя одновременно, вы можете получить двух пользователей с одинаковым идентификатором пользователя.

Чтобы перебрать курсор и получить помещенный возвращенный документ в массив:

var myArray = [];
User.find().sort('UserId','descending').limit(1).each(function(err, doc) {
    myArray.push(doc);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...