我有 2 个模型,Alarm
和 Alert
。
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/