2016-04-21 54 views
1

我試圖形成蒙戈分貝以下文檔的查詢:MongoDB的:在使用同一查詢結果從查詢同一文檔

myMetaDataDoc document 
{ 
    _id: <objectId>, 
    tour: 
    { 
    tourId: "TOURID1", 
    stops: [{ 
     locationId: "LOC1", 
     stopId: "STOPID1", 
     ... 
    ],[ 
     locationId: "LOC2", 
     stopId: "STOPID2", 
    ]} 
    } 
    schedule:{ 
    stopSchedules: [{ 
     stopId: "STOPID1" 
     ... 
    },{ 
     stopId: "STOPID2" 
     ... 
    }] 
    } 
} 

基本上,我想所有在各自的調度信息站一個位置。我需要一個查詢,以實現以下幾點:

  1. 查詢所有停止與位置(例如LOC1)
  2. 查詢從1
  3. 回報有stops.stopId所有stopSchedules停止+時間表

我試過的是使用聚合,但不能得到stops.stopId用於相同的查詢。這是我的嘗試:

db.myMetaDataDoc.aggregate([ 
{$match : {'tour.stops.locationId':'LOC1'}}, // all tour stops with locationId as LOC1 
{$unwind : '$tour.stops'}, // break all stops 
{$match : {'tour.stops.locationId':'LOC1'} }, // all tour with only stops with locationId as LOC1 
{$unwind : '$schedule.stopSchedules'}, // break all stopschedules 
{$match : {'schedule.stopSchedules.stopsId' : {$in :<stopId array>}} } // missing array of stopId 
]) 

除去最後$比賽,我收到一個「tour.stops」的所有行和單「schedules.stopSchedules」。

{ "_id" : ObjectId("xx1"), "myMetaDataDoc" : {"tour" : { "tourId" : "TOURID1", "stops" : { "locationId" : "LOC1", "stopId" : "STOPID1"} } , "schedule" : { "stopSchedules" : { "stopId" : "STOPID1", ...}}}} 
{ "_id" : ObjectId("xx2"), "myMetaDataDoc" : {"tour" : { "tourId" : "TOURID1", "stops" : { "locationId" : "LOC1", "stopId" : "STOPID1"} } , "schedule" : { "stopSchedules" : { "stopId" : "STOPID2", ...}}}} 

從這組行我只需要那些stops.stopId等於schedules.stopSchedules.stopId的。看來聚合不喜歡$在哪裏。我應該使用mapreduce()來代替嗎?或服務器端腳本?

欣賞所有的建議。

回答

0

在嘗試了一下聚合和$ eq運算符後,我想我已經接近我需要的東西了。我所做的是跳過最後一場比賽,並使用$ eq運算符在有效字段的所有行上使用組。我後來使用投影將其刪除。

db.myMetaDataDoc.aggregate([ 
{$match : {'tour.stops.locationId':'LOC1'}}, // all tour stops with locationId as LOC1 
{$unwind : '$tour.stops'}, // break all stops 
{$match : {'tour.stops.locationId':'LOC1'} }, // all tour with only stops with locationId as LOC1 
{$unwind : '$schedule.stopSchedules'}, // break all stopschedules 
{$group : { 
    '_id': '$tour.tourId', 
    valid: {$first: {$cond: [{$eq: ['$tour.stops.stopId','$schedule.stopSchedules.stopId']}, '1', '0']}}, // validate row 
    stop : { $first: '$tour.stops'}, 
    schedule : {$first: '$schedule.stopSchedules'} 
{$match : {'valid':'1'} }, // skip invalid rows 
{ 
    $project: {   // remove valid field 
     _id: 1, 
     stop: 1, 
     schedule:1 
    } 
} 
]) 

我仍然對更好的解決方案開放。