【问题标题】:How do you count the amount of documents in a MongoDB collection within Node?如何计算 Node 中 MongoDB 集合中的文档数量?
【发布时间】:2015-11-12 21:14:59
【问题描述】:

很奇怪的情况,我尝试了很多解决方案,但我似乎无法破解它。

我发现的很多资源只包含 mongo 控制台命令,我不确定你会如何在 Node.js 中编写它。

我试图解决这个问题的原因是我试图让每个文档的“id”从最后一个开始迭代,所以尝试查找集合中的文档数量,添加一个然后然后将该数字用作新文档的“id”。

【问题讨论】:

  • 您在 Node.js 中使用什么 MongoDB 驱动程序和/或库?
  • 您以错误的方式处理此问题。您想要一个包含“计数器”值的集合(很可能是单个文档)。请参阅:docs.mongodb.org/manual/tutorial/…。还有一个猫鼬插件:npmjs.com/package/mongoose-auto-increment
  • 我正在使用 Mongoose,我将研究其他方法。它提到如果您开始处理大量文档,这不是一个好主意。
  • 为什么“整数”作为主键对于大量文档来说不是一个好主意的原因是所有数据库的通用概念,也是默认选择ObjectId时的主要关注点对于 MongoDB 集合中的该值。数字计数器具有有限的限制,通过其他方式相形见绌。因此,该建议旨在鼓励您保留ObjectId。澄清一下。
  • 我们在这里讨论的是 MongoDB,这是一个旨在处理大量数据的数据库,可能分布在大量服务器上。因此,像“给我所有文档”或“确保特定数字在我的所有文档中唯一”这样的查询,不应该是你应该做的事情。

标签: node.js mongodb


【解决方案1】:

要获取集合中的文档数,请使用db.collection.find({}).count()

但是,您尝试执行的操作将行不通。当您对数据库进行大量并行访问时,可能会有多个线程同时执行此操作,接收相同的计数并因此插入具有相同 ID 的文档。根据CAP theorem的说法,像MongoDB这样的分布式数据库是无法提供这种一致性的。

您应该做的是依赖 MongoDB ObjectId's 作为文档的唯一标识符。当您没有为 _id 提供自己的值时,MongoDB 会自动为每个文档生成这些值。 ObjectId 是全局唯一的(对于任何实际目的都足够独特),因此您不会遇到任何冲突。它们也以时间戳开头,因此当您按_id 订购时,您会得到大致的时间顺序(如前所述,分布式系统不可能提供严格时间顺序)。

根据经验,当您在 SQL 中使用 AUTO_INCREMENT 时,您可能会在 MongodDB 中使用 ObjectId。

【讨论】:

  • 正是我正在寻找的那种答案。很棒的答案和很好的反馈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多