Mongodb mongo:添加数据后,日期查询的索引下限设置为true
我遇到一个问题,即在添加新数据后,mongo查询的计算方式不同 到DB。 基本上,我尝试查询给定日期范围内的条目 在添加数据之前,索引边界将按预期设置为查询给定的值,并且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
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")
]
]
}
....
}