搜索集合中游标的元素

时间:2017-07-12 10:21:16

标签: javascript mongodb meteor

最初的问题:在Meteor中,未实现明确。

我有一群飞行员:

Pilots : 
{
_id,
pilotcode : String,
name : String,
base : String
}

如果我这样做

var pilotCursor = Pilots.find({})

我把光标中的所有飞行员都拿走了;

现在我有一系列航班:

Flights : 
{
...
pilot : String
...
}

对于pilotcode中的每个pilotCursor,我想查找是否至少在Flights的航班中退出,然后打印找到的飞行员列表。 我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

你可以通过聚合实现这一点,这里不需要明确。

  1. 首先在pilotcode字段上的航班飞行员之间进行查找
  2. $project 阶段预测试点航班的大小
  3. 过滤掉没有航班的文件
  4. 将所有导航码分组到一个阵列中
  5. 这是查询:

    db.Pilots.aggregate([
      {$lookup: {from: "Flights", localField: "pilotcode", foreignField: "pilot", as: "pilot"}},
      {$project: { pilotcode: 1, size: {$size: "$pilot"}}},
      {$match: {size: {$gt: 0}}},
      {$group: {_id: null, listPilotCode: {$push: "$pilotcode"}}}
    ])
    

    这应输出:

    {"_id": null, "listPilotCode": [ pilotcode1, pilotcode2, ...]}
    

答案 1 :(得分:1)

我相信Felix解决方案不适用于Meteor,但会使用Mongo。据我记得,流星需要一些额外的触摸才能进行聚合,就像这个Meteor包:meteorhacks:aggregate

如果您只需要一个飞行员列表,我会在飞行中进行映射,将飞行员ID唯一地推送到阵列,然后返回飞行员:

我认为飞行中的飞行员是飞行员的飞行员代码。

将唯一值推送到数组是这样的:

 const pilots = [];
    Flights.find().map((flight) => {
     if(pilots.indexOf(flight.pilot) === -1){
            pilots.push(flight.pilot);
        }
    })
   Pilots.find({ pilotcode: { $in: pilots } })

并公开您需要的字段。

光标映射是查询Mongo DB的最有效方法之一。