5,000到10,000记录的Mongo集合包含:
{
"_id" : ObjectId("55e16c34c78b04f43f2f55a0"),
"appID" : NumberInt(4830800),
"topics" : {
"test1" : 1.440899998865E12,
"test2" : 1.440899998865E12,
"test3" : 1.440899998865E12,
"test4" : 1.440899998865E12
},
}
我需要在主题字段中查询包含指定属性名称的记录,并且指定名称的值大于或等于给定数字。
类似
find({"topics.test1": { $gte: 1440825382535 }})
此查询按预期工作,返回一组记录,其test1属性的test1值为> = 1440825382535
如果我在主题字段explain()
上创建一个简单索引,则表示查询没有使用索引(可以理解)。
可以搜索的属性名称集未预定义。该查询是根据在其他地方找到的名称动态构建的。
有没有办法将此表编入索引以加快查询速度?完整扫描查询需要相当长的时间才能运行(大约1.5秒)。
答案 0 :(得分:2)
要使此类数据可转换,您需要更改架构以使topics
成为数组,并将动态test1
,test2
等键移动到值中。
类似于:
{
"_id" : ObjectId("55e16c34c78b04f43f2f55a0"),
"appID" : NumberInt(4830800),
"topics" : [
{name: "test1", value: 1.440899998865E12},
{name: "test2", value: 1.440899998865E12},
{name: "test3", value: 1.440899998865E12},
{name: "test4", value: 1.440899998865E12}
]
}
然后您的查询更改为:
find({topics: {$elemMatch: {name: 'test1', value: {$gte: 1440825382535}}}})
您可以使用以下索引支持:
{'topics.name': 1, 'topics.value': 1}
答案 1 :(得分:1)
对你要做的事情有点困惑,但也许是这样的?
find({"topics.test1": {$exists: true}, { $gte: 1440825382535 }})