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

时间:2015-08-30 05:25:02

标签: mongodb mongodb-query

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秒)。

2 个答案:

答案 0 :(得分:2)

要使此类数据可转换,您需要更改架构以使topics成为数组,并将动态test1test2等键移动到值中。

类似于:

{ 
    "_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 }})