MongoDB按“数字”升序排列
Posted
技术标签:
【中文标题】MongoDB按“数字”升序排列【英文标题】:MongoDB order by "number" ascending 【发布时间】:2011-08-28 17:45:52 【问题描述】:我正在尝试使用 mongoose 和 MongoDB 创建一个注册表单。我有一个唯一的键 UserId,每次我创建一个新条目时,我都想取数据库中最大的 UserId 并将其加一。
我试过db.user.find().sort(userId: 1);
,但它似乎不起作用。
谢谢
马夏尔
【问题讨论】:
mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field 【参考方案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'
保存他们,并为自己保存一个索引。
我不建议将名称放在“_id”中。在您的应用程序中,您使用“_id”字段而不是有用的命名“用户名”。其他程序员可能更难阅读/理解。其次,如果您建立关系,则无法更改用户名。如果您更改用户名,那么您会破坏所有关系。或者你也需要改变所有的关系。【参考方案2】:
你可以这样做来获取当前最高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);
);
【讨论】:
谢谢,只是一个小问题。你告诉我的操作确实返回了一个数组,对吧?这将是 var result = db.user.find().sort( UserId: -1 ).limit(1);对吗? 它将返回一个游标而不是单个值,然后您可以对其进行迭代并加载到一个数组中。 关于如何迭代它的任何线索?我试图 console.log 它,但它打印出一些奇怪的东西,比如 model: [Function: model], op: 'find'
,我不知道到底是什么。
不是猫鼬专家,但我添加了我的 sn-p 可能会有所帮助。可能不是最好的方法!
感谢您的 sn-p,但遗憾的是它打印了一个空数组 ([])。再次感谢!我会自己想办法! :)以上是关于MongoDB按“数字”升序排列的主要内容,如果未能解决你的问题,请参考以下文章
使用mongoose在mongodb中按升序和降序对多个字段进行排序