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按“数字”升序排列的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB升序/降序定位错误值

MongoDb索引--基础篇

使用mongoose在mongodb中按升序和降序对多个字段进行排序

使用 mongodb 聚合管道按升序向集合中的所有记录添加日期

MongoDB地理空间查询结果未按距离顺序排列

MongoDB 排序