【问题标题】:How can I find all documents with a matching ID using an array of another object?如何使用另一个对象的数组找到具有匹配 ID 的所有文档?
【发布时间】:2017-03-01 07:01:49
【问题描述】:

我有 2 个模型,AlarmAlert

AlertSchema 有一个 created_by 字段,它引用了一个 Alarm 对象 ID。

给定一组Alarmobjects,我如何找到所有对应的警报?

这不起作用(我真的没想到)

// Get array of alarm objects
Alarm.find({unit: req.unit._id}).exec(function(err, alarms){
   // Use array of alarm objects to find all alerts
   Alert.find({created_by: alarms})

我最好的办法是将每个对象的 _id 提取到一个数组中,并将其作为参数传递,如下所示:

    Alarm.find({unit: req.unit._id}).exec(function(err, alarms){
   var alarm_ids = alarms.map(function(o){return o._id});
   // Use array of alarm objects to find all alerts
   Alert.find({created_by: alarm_ids})

【问题讨论】:

    标签: javascript mongodb mongoose


    【解决方案1】:

    您实际上可以使用聚合框架并使用 $lookup 运算符进行查询,从而可以对另一个集合进行左外连接。

    检查以下示例:

    Alarm.aggregate([
        { "$match": { "unit": req.unit._id } },
        {
            "$lookup": {
                "from": "alerts",
                "localField": "_id",
                "foreignField": "created_by",
                "as": "alarm_alert"
            }
        },
        { "$unwind": "$alarm_alert "}
    ]).exec(function(err, result){
        console.log(JSON.stringify(result, null, 4));
    });
    

    以上是高效的,因为它是原子查询并使用本地运算符。


    在您的解决方案尝试中,您错过了 $in 运算符作为您的拼图游戏的最终选择,但让苍蝇成为庆祝美中的一件事是您正在制作对服务器的重复调用,即一个用于检索警报对象,另一个用于查询警报集合,因此它可能不如上述聚合操作高效:

    Alarm.find({ "unit": req.unit._id })
          .lean() // <-- return plain javascript objects
          .exec(function(err, alarms){
                var alarm_ids = alarms.map(function(o){return o._id});
                // Use array of alarm objects to find all alerts
                Alert.find({ "created_by": { "$in": alarm_ids } }).exec(callback);
           });
    

    【讨论】:

      猜你喜欢
      • 2016-10-18
      • 1970-01-01
      • 2019-04-11
      • 2023-03-20
      • 2013-01-20
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多