2016-08-18 66 views
2

我有MongoDB中的數據集,這是一個線我的數據的一個示例:查詢當陣列大小被存儲在一個變量

{ "conversionDate": "2016-08-01", 
    "timeLagInDaysHistogram": 0, 
    "pathLengthInInteractionsHistogram": 4, 
    "campaignPath": [ 
     {"campaignName": "name1", "source": "sr1", "medium": "md1", "click": "0"}, 
     {"campaignName": "name2", "source": "sr1", "medium": "md1", "click": "0"}, 
     {"campaignName": "name1", "source": "sr2", "medium": "md2", "click": "1"}, 
     {"campaignName": "name3", "source": "sr1", "medium": "md3", "click": "1"} 
    ], 
    "totalTransactions": 1, 
    "totalValue": 37.0, 
    "avgCartValue": 37.0 
} 

(長度的campaignPath不是恆定的,所以每行可以有不同數量的元素。

而且我要找到匹配campaignPath的最後一個元素「來源= SR1」 元素。

我知道我不能用som進行查詢ething像

db.paths.find(
    { 
     'campaignPath.-1.source': "sr1" 
    } 
) 

但是,因爲我有 「pathLengthInInteractionsHistogram」 存儲等於campaignPath lenght的長度,我不能這樣做:

db.paths.find(
    { 
     'campaignPath.$pathLengthInInteractionsHistogram.source': "sr1" 
    } 
) 
+0

@JohnnyHK我想整個文件,因爲我需要的日期等信息。 –

回答

0

與MongoDB的3.2開始,你可以與aggregate一起執行此操作,該操作提供$arrayElemAt運算符,該運算符接受-1索引以訪問最後一個元素。

db.paths.aggregate([ 
    // Project the original doc along with the last campaignPath element 
    {$project: { 
    doc: '$$ROOT', 
    lastCampaign: {$arrayElemAt: ['$campaignPath', -1]} 
    }}, 
    // Filter on the last campaign's source 
    {$match: {'lastCampaign.source': 'sr1'}}, 
    // Remove the added lastCampaign field 
    {$project: {doc: 1}} 
]) 

在早期版本中,您使用$where卡住了。這將工作,但有表現不佳:

db.paths.find({ 
    $where: 'this.campaignPath[this.pathLengthInInteractionsHistogram-1].source === "sr1"' 
}) 

,你同樣可以做到不使用pathLengthInInteractionsHistogram

db.paths.find({$where: 'this.campaignPath[this.campaignPath.length-1].source === "sr1"'}) 
+0

謝謝!當我們升級我們的數據庫版本(我們在3.0版本中運行)時,我會試試這個。只是「爲了科學」。這可以在3.0中完成嗎? –

+0

@MartinMas查看更新的答案。 – JohnnyHK