Mongodb Mongo查询嵌入对象属性的存在性和值

Mongodb Mongo查询嵌入对象属性的存在性和值,mongodb,mongodb-query,Mongodb,Mongodb Query,一个5000到10000条记录的Mongo集合包含: { "_id" : ObjectId("55e16c34c78b04f43f2f55a0"), "appID" : NumberInt(4830800), "topics" : { "test1" : 1.440899998865E12, "test2" : 1.440899998865E12, "test3" : 1.440899998865E12,

一个5000到10000条记录的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的记录

如果我在topics字段
explain()
上创建了一个简单的索引,则表示查询没有使用索引(这是可以理解的)

未预定义可搜索的属性名称集。查询是基于在别处找到的名称动态生成的


有没有办法索引此表以加快查询速度?完整扫描查询需要相当长的运行时间(大约1.5秒)。

对您试图执行的操作感到有点困惑,但可能是这样的

find({"topics.test1": {$exists: true}, { $gte: 1440825382535 }})

要使这种类型的数据可索引,您需要更改模式以使
主题
成为一个数组,并将动态
test1
test2
等键移动到值中

比如:

{
“_id”:ObjectId(“55e16c34c78b04f43f2f55a0”),
“appID”:数字打印(4830800),
“主题”:[
{name:“test1”,值:1.440899998865E12},
{name:“test2”,值:1.440899998865E12},
{名称:“test3”,值:1.440899998865E12},
{名称:“test4”,值:1.440899998865E12}
] 
}
然后您的查询将更改为:

find({topics:{$elemMatch:{name:'test1',value:{$gte:1440825382535}}})
您可以使用以下索引来支持:

{'topics.name':1,'topics.value':1}

谢谢,我试试看