【问题标题】:mongodb query referenced objects inside arraymongodb查询数组内的引用对象
【发布时间】:2020-05-22 10:58:44
【问题描述】:

我在 nodejs 中使用猫鼬。我正在尝试查询一些包含由引用对象组成的列表的字段。我创建了两个架构

飞行员

var PilotSchema = new mongoose.Schema({
    races: [{type: mongoose.Schema.Types.ObjectId, ref: 'Race'}],
});

种族

var RaceSchema = new mongoose.Schema({
    start_ms: Number,
});

这里我只写了相关的字段。

在比赛模式中,我有一个键 start_ms,它以毫秒为单位指示比赛开始的日期,在 PilotSchema races 字段中,我保存了对许多比赛的引用。

我想做的是:

  • 以毫秒为单位获取未来的日期 (my_date)
  • 检索所有在间隔(my_date - 2_hours,my_date + 2_hours)内没有比赛的飞行员

我试着做一个例子来更好地解释。

我的日期:2020 年 2 月 23 日 - 12:00:00(以毫秒为单位),

在试验场races 我有很多对RaceSchema 的引用,在每个引用的对象中都有比赛开始的时间。

现在查询 Pilots 集合,我想检索他们 races 字段中没有在 (Feb 23 2020 - 10:00:00 - Feb 23 2020 - 14:00:00) 期间开始的比赛的所有飞行员

我尝试使用此查询但没有用

races: {$not:
  {$elemMatch: 
    {start_ms: 
      { "$gt" : min_time, "$lt" : max_time }
    }
  }
}

在哪里

min_time, max_time = my_date - 2_hours, my_date + 2_hours

实际上我不知道该怎么做,我看到要检索间隔中的数字,我可以使用 $gt$lt 但我不明白如何查询尊重的引用对象数组这个具体的条件。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    您必须为此编写一个聚合查询,从 pilot 中找到您对 races 的引用并根据您的条件过滤它们

     Pilot.aggregate([
                {
                    $lookup:{
                        from:'races',
                        localField:'races',
                        foreignField:'_id',
                        as:'races'
                    }
                },{
                    $unwind:'$races'
                },
                {
                    $match:{
                        'races.start_ms':{
                            "$gt" : min_time, "$lt" : max_time
                        }
                    }
                },{
                    $group:{
                        _id:'$_id',
                        name:{$first:'$name'}
                    }
                }
            ]);
    

    假设您的 pilot 架构中有 name,您可以通过编写此查询来获取所有此类 pilots 的列表

    【讨论】:

      猜你喜欢
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 2012-05-05
      • 2014-05-13
      • 1970-01-01
      • 2020-07-27
      相关资源
      最近更新 更多