MongoDB объединяет две коллекции с предложением Между - PullRequest
1 голос
/ 27 апреля 2019

Есть коллекция "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.1 равно 3232235521. Каждая запись в филиалах описывает подсеть. Каждый принтер расположен в одной ветке.

Если printers.ip_int между записями ветвей [ip_start;ip_end], то запрос должен вернуть все поля из Printer и одно поле "Name" из "Branches" collection.

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 27 апреля 2019

Вам необходим поиск с пользовательским конвейером , где вы можете указать условие «между»:

db.Branches.aggregate([
    {
        $lookup: {
            from: "Printers",
            let: { ip_start: "$ip_start", ip_end: "$ip_end" },
            pipeline: [
                {
                    $match: {
                        $expr: {
                            $and: [
                                { "$gte": [ "$ip_int", "$$ip_start" ] },
                                { "$lte": [ "$ip_int", "$$ip_end" ] },
                            ]
                        }
                    }
                }
            ],
            as: "Printers"
        }
    }
])
0 голосов
/ 29 апреля 2019
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
        }
    }
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...