总对象与mongodb中单个文档集合计数的总和不匹配,集合计数也不匹配

时间:2016-07-21 05:17:05

标签: mongodb

当我在测试数据库中执行db.stats时,我得到以下内容

db.stats()
{
        "db" : "test",
        "collections" : 6,
        "objects" : 1000032,
        "avgObjSize" : 112.00064797926467,
        "dataSize" : 112004232,
        "storageSize" : 175812608,
        "numExtents" : 17,
        "indexes" : 8,
        "indexSize" : 169905456,
        "fileSize" : 2080374784,
        "nsSizeMB" : 16,
        "extentFreeList" : {
                "num" : 77,
                "totalSize" : 760766464
        },
        "dataFileVersion" : {
                "major" : 4,
                "minor" : 22
        },
        "ok" : 1
}

这些是我在测试数据库中的不同集合

db.getCollectionNames();
[
        "foo",
        "sentences",
        "stackoverflow",
        "system.indexes",
        "system.profile"
]

以下是每个集合上文件的单独计数

db.foo.count() - 1000000
db.sentences.count() - 7
db.stackoverflow.count() - 2
db.system.indexes.count() - 8
db.system.profile.count() - 2

现在我有两个问题

1)为什么我在db.stats()查询中将集合作为6,当我在db.getCollectionNames()中只有5时

2)文档总数应为1000000 + 7 + 2 + 8 + 2 = 1000016,但在db.stats中,我得到“对象”:1000032

请帮助您理解这个

db.version();
3.0.3

db.serverStatus().storageEngine
{ "name" : "mmapv1" }
  

其他信息

我在mongo shell中创建了一个全新的DB并执行了db.stats并获得了以下结果

use newdb
db.stats()
{
        "db" : "newdb",
        "collections" : 0,
        "objects" : 0,
        "avgObjSize" : 0,
        "dataSize" : 0,
        "storageSize" : 0,
        "numExtents" : 0,
        "indexes" : 0,
        "indexSize" : 0,
        "fileSize" : 0,
        "ok" : 1
}

现在所有数据都显示正确,然后我创建了一个集合并只插入了一条记录,然后我再次得到了计数中的差异。

db.mycollection.insert({_id:1, name:'Clement Amarnath'});

WriteResult({ "nInserted" : 1 })

db.stats()
{
        "db" : "newdb",
      "collections" : 3,
      "objects" : 5,
        "avgObjSize" : 60.8,
        "dataSize" : 304,
        "storageSize" : 20480,
        "numExtents" : 3,
        "indexes" : 1,
        "indexSize" : 8176,
        "fileSize" : 67108864,
        "nsSizeMB" : 16,
        "extentFreeList" : {
                "num" : 0,
                "totalSize" : 0
        },
        "dataFileVersion" : {
                "major" : 4,
                "minor" : 22
        },
        "ok" : 1
}

db.getCollectionNames()
[ "mycollection", "system.indexes" ]

db.system.indexes.count()
1

1 个答案:

答案 0 :(得分:1)

收集计数的原因始终为+1 db.getCollectionNames上列出的实际收藏集,是否有隐藏的集合system.namespaces,用于存储有关集合的信息。

这也解决了总物体的差异。

db.stats()
{
        "db" : "test",
      "collections" : 6, 
      "objects" : 1000035,
        "avgObjSize" : 112.0006479773208,
        "dataSize" : 112004568,
        "storageSize" : 175812608,
        "numExtents" : 17,
        "indexes" : 8,
        "indexSize" : 169905456,
        "fileSize" : 2080374784,
        "nsSizeMB" : 16,
        "extentFreeList" : {
                "num" : 77,
                "totalSize" : 760766464
        },
        "dataFileVersion" : {
                "major" : 4,
                "minor" : 22
        },
        "ok" : 1
}

集合

db.getCollectionNames()
[
        "foo",
        "sentences",
        "stackoverflow",
        "system.indexes",
        "system.profile"
]

收藏计数

db.stats中列出的馆藏数量为6 = db.getCollectionNames() is 5 +馆藏system.namespaces =将馆藏数量计为6。

对象计数

db.stackoverflow.count() - 5
db.foo.count() - 1000000
db.system.namespaces.count() - 13
db.system.indexes.count() - 8
db.system.profile.count() - 2
db.sentences.count() - 7
db.stackoverflow.count() - 5

Document count = 5+1000000+13+8+2+7+5 = 10000035