2015-08-30 50 views
2

的價值5000到10000的記錄蒙戈集合包含:蒙戈查詢存在和嵌入對象屬性

{ 
    "_id" : ObjectId("55e16c34c78b04f43f2f55a0"), 
    "appID" : NumberInt(4830800), 
    "topics" : { 
     "test1" : 1.440899998865E12, 
     "test2" : 1.440899998865E12, 
     "test3" : 1.440899998865E12, 
     "test4" : 1.440899998865E12 
    }, 
} 

我需要查詢的,在主題領域包含了指定的屬性名稱和記錄,其中的價值指定的名稱大於或等於給定的數字。

​​

此查詢工作正常,返回一組有一個test1的值test1的財產記錄> = 1440825382535

如果我創建的主題領域一個簡單的索引explain()表示沒有索引用於查詢(可以理解)。

可能搜索的一組屬性名稱未預定義爲。該查詢是基於在別處找到的名稱動態構建的。

有沒有一種方法來索引此表以加快查詢速度?全掃描查詢需要相當多的時間來運行(大約1.5秒)。

回答

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} 
+0

謝謝,我會試一試 – RoyHB

0

對你想要做的事情有點困惑,但也許是這樣的?

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