3

我正在尝试使用 mongoose 和 MongoDB 创建一个注册表单。我有一个唯一的键 UserId,每次创建新条目时,我都想取数据库中最大的 UserId 并将其加一。我试过了,db.user.find({}).sort({userId: 1});但它似乎不起作用。谢谢

马夏尔

4

2 回答 2

6

您可以这样做以获取当前最高的用户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 中没有办法在单个原子事务中获取此值并插入新用户,它仅支持对单个文档的原子操作。您需要注意另一个操作没有同时插入另一个用户,您最终可能会得到两个具有相同 UserId 的用户。

遍历光标并将返回的文档放入数组中:

var myArray = [];
User.find().sort('UserId','descending').limit(1).each(function(err, doc) {
    myArray.push(doc);
});
于 2011-05-19T10:08:21.287 回答
6

您想要做的听起来更像是具有自动增量的关系数据库模式。我会推荐另一种解决方案。

起初你已经有一个唯一的 id。它会自动创建并位于“_id”字段中。对我来说,您似乎想要一个用于建立关系的用户 ID,但您已经可以使用 _id 中的值。

您想要增加 id 的另一件事可能是您创建了一个 web 应用程序并且可能想要“更好”的 url?例如。/user/1 而不是 /user/abc48df...?

如果是这种情况,我更愿意在用户名上创建一个唯一约束。而不是 id 你在 url "/user/john" 中使用你的用户名。

有了这个,你的网址就更好了。对于建立关系,您可以使用 _id。而且您不会遇到首先获取最高数字的问题。

创建唯一索引:

db.collection.ensureIndex({username: 1}, {unique: true})
于 2011-05-19T13:07:48.663 回答