MongoDB跨表查询

// 清除不在birdnestPatientData表中的eagleDynamicTypeInstance({dynamicTypeId:'01'})病人数据

// 在mongodb可视化工具中, 设置超时时间300s(options->change shell timeout, 填300)

// 超时时间不够再加

var result = db.eagleDynamicTypeInstance.aggregate([
    {
        $match:{dynamicTypeId:'01'}
    },
    {
        $lookup: {
            from: 'birdnestPatientData',
            localField: 'key',
            foreignField: '_id',
            as: 'new_doc'
        }
    },
    {
        $project:{new_doc:1, key:1}
    }
]);
for(var item of result.toArray()) {
    var data = item.new_doc;
    if(data.length == 0) {
        db.eagleDynamicTypeInstance.remove({key:item.key});
    }
};

上面的语句中核心是MongoDB的聚合aggregate的使用,基本用法是db.collection.aggregate(pipeline, options).
pipeline和options的具体介绍参考https://www.mongodb.com/docs/manual/reference/method/db.collection.aggregate/
分析上面的语句,
lookup执行的相当于一个join操作,
from是要连接的另一个collection,
localField是当前collection的字段名,
foreignField是另一个collection中要和localField比较的字段名,
as是一个新的字段名,这个字段中存放匹配起来的document;
$project选择要保留的字段.
aggregate方法返回的是cursor类型, 所以处理之前先转换成数组再进行遍历.
在遍历的过程中查看定义的新字段中是否有匹配上的记录,没有的话就将这个instance删除,
这样遍历完之后剩下的就是在院的病人实例了.

你可能感兴趣的:(MongoDB跨表查询)