Mongodb mongo:添加数据后,日期查询的索引下限设置为true

Mongodb mongo:添加数据后,日期查询的索引下限设置为true,mongodb,Mongodb,我遇到一个问题,即在添加新数据后,mongo查询的计算方式不同 到DB。 基本上,我尝试查询给定日期范围内的条目 在添加数据之前,索引边界将按预期设置为查询给定的值,并且isMultiKey=false: > db.tf.find( { "transforms.header.stamp": { $lt: new Date(1396512603500), $gte: new Date(1396512602000) } } ).explain() { "cursor" : "Btree

我遇到一个问题,即在添加新数据后,mongo查询的计算方式不同 到DB。 基本上,我尝试查询给定日期范围内的条目

在添加数据之前,索引边界将按预期设置为查询给定的值,并且
isMultiKey=false

> db.tf.find( { "transforms.header.stamp": { $lt: new Date(1396512603500), $gte: new Date(1396512602000) } } ).explain()
{
    "cursor" : "BtreeCursor transforms.header.stamp_1",
    "isMultiKey" : false,
    "n" : 49,
    "nscannedObjects" : 49,
    "nscanned" : 49,
    ....
    "millis" : 3,
    "indexBounds" : {
        "transforms.header.stamp" : [
            [
                ISODate("2014-04-03T08:10:02Z"),
                ISODate("2014-04-03T08:10:03.500Z")
            ]
        ]
    }
    ....
}
添加数据后,将索引下限设置为
true
,以便扫描到上限的整个文档,并且
isMultiKey=true

> db.tf.find( { "transforms.header.stamp": { $lt: new Date(1396512603500), $gte: new Date(1396512602000) } } ).explain()
{
    "cursor" : "BtreeCursor transforms.header.stamp_1",
    "isMultiKey" : true,
    "n" : 49,
    "nscannedObjects" : 20489,
    "nscanned" : 20489,
    ....
    "millis" : 645,
    "indexBounds" : {
        "transforms.header.stamp" : [
             [
                 true,
                 ISODate("2014-04-03T08:10:03.500Z")
             ]
        ]
    }
    ....
}
据我所知,
multiKey=true
意味着索引已建立 数组值。但是“transform.header.stamp”不包含任何数组值:

> db.tf.find( { "transforms.header.stamp": { $type: 4 } } ).count()
0
按预期找到日期类型的条目:

> db.tf.find( { "transforms.header.stamp": { $type: 9 } } ).count()
554672
查询具有时间戳类型的条目会产生错误(为什么?)

为什么下限设置为
true
和 为什么添加新数据后,
multiKey=true
? 添加的数据一定有问题,但是 我无法理解(这是一个5GB的JSON转储)

编辑:使用$elemMatch可再次工作:

> db.tf.find( { "transforms.header.stamp": { $elemMatch: { $lt: new Date(1396512603500), $gte: new Date(1396512602000) } } } ).explain()
{
    "cursor" : "BtreeCursor transforms.header.stamp_1",
    "isMultiKey" : true,
    "n" : 0,
    "nscannedObjects" : 49,
    "nscanned" : 49,
    ....
    "millis" : 0,
    "indexBounds" : {
        "transforms.header.stamp" : [
            [
                ISODate("2014-04-03T08:10:02Z"),
                ISODate("2014-04-03T08:10:03.500Z")
            ]
        ]
    }
    ....
}

所以看起来确实存在数组值。如何查询它们?

是否有属于对象的
transforms.header.stamp
的值
db.tf.find({“transforms.header.stamp”:{“$type”:3}})
?另外,请尝试查询所有具有非时间戳字段类型的文档:
db.tf.find({“transforms.header.stamp”:{“$NOT”:{“$type”:4}}}})
事实上,有些记录未定义此值。我删除了它们,以便
db.tf.find({“transforms.header.stamp”:{“$not”:{“$type”:4}}}})=0
。但不幸的是,问题依然存在
> db.tf.find( { "transforms.header.stamp": { $elemMatch: { $lt: new Date(1396512603500), $gte: new Date(1396512602000) } } } ).explain()
{
    "cursor" : "BtreeCursor transforms.header.stamp_1",
    "isMultiKey" : true,
    "n" : 0,
    "nscannedObjects" : 49,
    "nscanned" : 49,
    ....
    "millis" : 0,
    "indexBounds" : {
        "transforms.header.stamp" : [
            [
                ISODate("2014-04-03T08:10:02Z"),
                ISODate("2014-04-03T08:10:03.500Z")
            ]
        ]
    }
    ....
}