MongoDB:在同一文档中使用来自同一查询的查询结果



我正在尝试使用 mongo db 中的以下文档形成查询:

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 查询所有具有 stops.stopId 的 stopSchedules。
  3. 回程站+时间表

我尝试的是使用聚合,但无法在同一查询中使用 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
])

删除最后一个$match,我收到带有单个"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 的行。看来聚合不喜欢$where。我应该改用mapreduce()吗?还是服务器端脚本?

感谢所有建议。

在尝试了聚合和$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
    }
 }
])

我仍然愿意寻求更好的解决方案。

相关内容

  • 没有找到相关文章