javascript - 如何使用另一个对象的数组找到具有匹配 ID 的所有文档?

标签 javascript mongodb mongoose

我有 2 个模型,AlarmAlert

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

给定一个Alarm对象数组,如何找到所有相应的警报?

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

// 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})

最佳答案

您实际上可以使用聚合框架并使用 $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));
});

上面的代码非常高效,因为它是原子查询并使用 native 运算符。

<小时/>

根据您的解决方案尝试,您错过了 $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);
       });

关于javascript - 如何使用另一个对象的数组找到具有匹配 ID 的所有文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40134765/

相关文章:

javascript - HTML5 中 <canvas> 部分的就地裁剪

javascript - "hover"CSS 选择器内的代码停止工作

javascript - 使用 datatable.net 导出数据时删除列

mongodb - 如何在mongodb中取消设置后删除值为null的数组字段

node.js - 在 Windows 7 上 npm install mongoose 失败

node.js - Mongoose 子文档架构上的 Object.assign() 问题

javascript - Mongoose 模式,设置关键变量

javascript - AngularJS - ng-bind 不更新

node.js - Mongoose - Node.js 服务器重新启动后无法创建数据库

java - 第一次使用 MongoTemplate 保存文档