MongoDB使用between子句连接两个集合

时间:2019-04-27 14:17:49

标签: mongodb join aggregation-framework

有一个收藏集"Printers"

{ 
"_id" : ObjectId("5cc02f9b9931de72296ba6c2"), 
"model" : "Xerox WorkCentre 3315", 
"serial" : "3255498494", 
"date" : ISODate("2019-04-25T08:57:48.001+0000"), 
"pages" : NumberInt(4868), 
"location" : "New location", 
"ip" : "10.159.0.35", 
"ip_int" : NumberInt(178192419)
}

和“分支”集合:

{ 
 "_id" : ObjectId("5cb4799b8c0cfe35e4a4c266"), 
 "name" : "Office 1", 
 "ip_start" : NumberLong(178192384), 
 "ip_end" : NumberLong(178194431)
}
 // ----------------------------------------------
{ 
 "_id" : ObjectId("5cb479e68c0cfe35e4a4c269"), 
 "name" : "Office 2", 
 "ip_start" : NumberLong(3232258048), 
 "ip_end" : NumberLong(3232258303)
}

"Branches"集合包含转换为整数值的IP地址,即192.168.0.13232235521。分支中的每个记录都描述了子网。 每台打印机都位于一个分支中。

如果分支之间的printers.ip_int记录[ip_start;ip_end],则查询应返回Printer的所有字段和"Name"集合的一个字段"Branches"

我该怎么做?

2 个答案:

答案 0 :(得分:1)

您需要一个lookup with custom pipeline,可以在其中指定“介于”条件:

line

答案 1 :(得分:0)

db.getCollection("printers").aggregate(
[
    { 
        "$lookup" : {
            "from" : "branches", 
            "let" : {
                "ip_int" : "$ip_int"
            }, 
            "pipeline" : [
                {
                    "$match" : {
                        "$expr" : {
                            "$and" : [{"$gte" : ["$$ip_int", "$ip_start"]}, 
                                { "$lte" : ["$$ip_int", "$ip_end"]}
                            ]
                        }
                    }
                }
            ], "as" : "Printers"
        }
    }, 
    { 
        "$sort" : {
            "ip_int" : 1.0
        }
    }, 
    { 
        "$unwind" : {
            "path" : "$Printers"
        }
    }, 
    { 
        "$addFields" : {
            "filial" : "$Printers.name"
        }
    }, 
    { 
        "$project" : {
            "Printers" : false, "ip_int" : false
        }
    }
]);