【发布时间】:2011-08-28 17:45:52
【问题描述】:
我正在尝试使用 mongoose 和 MongoDB 创建一个注册表单。我有一个唯一的键 UserId,每次我创建一个新条目时,我都想取数据库中最大的 UserId 并将其加一。
我试过db.user.find({}).sort({userId: 1});,但它似乎不起作用。
谢谢
马夏尔
【问题讨论】:
我正在尝试使用 mongoose 和 MongoDB 创建一个注册表单。我有一个唯一的键 UserId,每次我创建一个新条目时,我都想取数据库中最大的 UserId 并将其加一。
我试过db.user.find({}).sort({userId: 1});,但它似乎不起作用。
谢谢
马夏尔
【问题讨论】:
您想要做的听起来更像是具有自动增量的关系数据库架构。我会推荐另一种解决方案。
一开始你已经有一个唯一的 id。它会自动创建并位于“_id”字段中。对我来说,您似乎想要一个 UserID 来建立关系,但您已经可以使用 _id 中的值了。
您想要增加 id 的另一件事可能是您创建了一个 web 应用程序并且可能想要“更好”的 url?例如。 /user/1 而不是 /user/abc48df...?
如果是这种情况,我更愿意在用户名上创建一个唯一约束。而不是 id 你在 url "/user/john" 中使用你的用户名。
有了这个,你的网址就更好了。对于建立关系,您可以使用 _id。而且您不会遇到先获取最高数字的问题。
创建唯一索引:
db.collection.ensureIndex({username: 1}, {unique: true})
【讨论】:
_id 字段。该字段自动是唯一的。如果您的用户有唯一的名称,您可以使用_id:'gates' 保存他们,并为自己保存一个索引。
你可以这样做来获取当前最高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);
});
【讨论】:
{ model: [Function: model], op: 'find' },我不知道到底是什么。