【问题标题】:MongoDB extra CollectionsMongoDB 额外集合
【发布时间】:2015-06-15 19:27:33
【问题描述】:

我有一个名为 index 的数据库,只有一个名为 student 的集合。

当我触发查询db.students.find({}).count()

它显示了 1000000 个文档。

但是当我使用 db.stats() 时,它显示的结果如下:-

{
        "db" : "index",
        "collections" : 3,
        "objects" : 1000004,
        "avgObjSize" : 59.95997216011136,
        "dataSize" : 59960212,
        "storageSize" : 87420928,
        "numExtents" : 14,
        "indexes" : 1,
        "indexSize" : 32458720,
        "fileSize" : 520093696,
        "nsSizeMB" : 16,
        "ok" : 1
}
  1. 3个合集怎么样?

  2. 对象 1000004 的数量比预期的多 4 个?

最后我做到了db.getCollectionNames() 它显示[ "student", "system.indexes" ]

system.indexes 是什么?

请有人详细说明一下吗?

我是 mongo 世界的新手。

【问题讨论】:

  • @w0lf 很好,但还有一个疑问是,如果我做了 db.getCollectionNames() 它只显示 2 个集合,那么为什么 stats() 中有 3 个
  • 对。我刚刚意识到我有一个数据库,其中 show collections 显示 4 个项目,但 db.stats() 显示计数为 5。有兴趣看看答案是什么 :)
  • 是的,让我们等待一些天才。
  • @squiroid:虽然我不是天才,但我希望我的回答对您有所帮助。 ;)

标签: mongodb mongodb-query database


【解决方案1】:

神秘2合集

当用户第一次在数据库中存储数据或显式创建数据库时,会创建两个集合。

第一个,system.indexes 保存有关在数据库的各种集合中定义的索引的信息。您甚至可以使用

db.system.indexes.find()

隐藏的system.namespaces 持有一些关于数据库的元数据,从数据库管理的角度来看,实际上是所有现有实体的名称。

虽然没有显示,但您仍然可以访问它:

db.system.namespaces.find()

警告:不要摆弄它们中的任何一个。您的数据库很可能变得无法使用。您已被警告!

可能不止这两个。阅读System Collections in the MongoDB docs了解详情。

神秘的四件物品

实际上,如果您尝试过如上所示访问系统数据库,这将变得非常容易。在名为foobardb 的数据库中,集合foo_id 上的默认索引,查询system.indexes 将得到如下结果(美化):

{
  "v" : 1,
  "key" : {
    "_id" : 1
  },
  "name" : "_id_",
  "ns" : "foobardb.foo"
}

请注意,这是一个单独的文档。第二个查询的美化输出如下所示:

{ "name" : "foobardb.foo" }
{ "name" : "foobardb.system.indexes" }
{ "name" : "foobardb.foo.$_id_" }

在这里,我们有三个文件。所以我们在元数据中有 4 个额外的文档。

【讨论】:

  • 不错的答案。只是想补充一点,这些集合是一个实现细节,例如,在 WiredTiger 中不以相同的方式存在。您不仅不应该改变它们,而且根本不应该使用它们。
  • @wdberkeley:谢谢,但事实是所有代表都应该交给 Adam 和 MongoU。 ;)
猜你喜欢
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多