Мне нужна ваша помощь для запроса агрегации.Я провел несколько поисков перед публикацией, но ни один из найденных результатов не помог мне.
У меня есть эти документы:
заказ:
{
"_id" : MongoId,
"customId" : integer,
... other fields
"circuit" : MongoId, // Ref to Circuit Document
"agency" : MongoId, // Ref to Agency document
"customer" : MongoId, // Ref to Customer document
"places" : [ // Array of MongoId ref to place document
MongoId,
MongoId,
...
],
"materials" : [ // Array of MongoId ref to material document
MongoId,
MongoId,
...
],
... other fields
}
схема:
{
"_id" : MongoId,
"customId" : Integer,
"name" : String,
"state" : String,
"type" : String,
"agency" : MongoId,
"trucks" : [ // Array of MongoId ref to truck document
MongoId,
MongoId,
...
],
"drivers" : [ // Array of MongoId ref to truck document
MongoId,
MongoId,
...
],
"orders" : [ // Array of MongoId ref to order document
MongoId,
MongoId,
...
]
}
Поэтому мне нужно получать водителей, грузовики, заказы на каждую трассу.С этой частью все в порядке, запрос работает (см. Ниже).
Но я не смог достать все места и материалы из каждого заказа из каждой схемы.
Итак, вот мой текущий запрос:
db.circuit.aggregate([
{$match: {"date": {$lte: ISODate("2019-04-01 23:59:59")}}},
{$match: {"date": {$gte: ISODate("2019-03-31 00:00:59")}}},
{
$lookup: {
from: "agency",
localField: "agency",
foreignField: "_id",
as: "agency"
}
},
{$unwind: "$agency"},
{
$lookup: {
from: "order",
localField: "orders",
foreignField: "_id",
as: "orders"
}
},
{
$lookup: {
from: "driver",
localField: "drivers",
foreignField: "_id",
as: "drivers"
}
},
{
$group:
{
"_id": "$_id",
"agency": {$addToSet: "$agency.name"},
"date": {$addToSet: "$date"},
"orders": {$addToSet: "$orders"},
"drivers": {$addToSet: "$drivers"},
}
},
{$unwind: "$agency"},
{$unwind: "$date"},
{$unwind: "$orders"},
{$unwind: "$drivers"},
{
$project: {
"agency": "$agency",
"date": "$date",
"closedOrders": {
$map: {
input: {
$filter: {
input: "$orders",
as: "o",
cond: {
$in: [
"$$o.state", ["closed"]
]
}
}
},
as: "order",
in: {
"id": "$$order.customId"
}
}
},
"startedOrders": {
$map: {
input: {
$filter: {
input: "$orders",
as: "o",
cond: {
$in: [
"$$o.state", ["started"]
]
}
}
},
as: "order",
in: {
"id": "$$order.customId"
}
}
},
"plannedOrders": {
$map: {
input: {
$filter: {
input: "$orders",
as: "o",
cond: {
$in: [
"$$o.state", ["started", "added"]
]
}
}
},
as: "order",
in: {
"id": "$$order.customId"
}
}
},
"orders": {
$map: {
input: "$orders",
as: "o",
in: {
... Orders fields
}
}
},
"drivers": {
$map: {
input: "$drivers",
as: "driver",
in: {
... Drivers fields
}
}
}
}
}
]);
Я попробовал несколько способов получить места и материалы по заказам из схемы (двухуровневый документ).
Чтобы проиллюстрировать мою потребность, выходные данные должны выглядеть следующим образом:
{
"_id" : "5c6e6f7be05bd900a1682582",
"customId" : 4966075,
"name" : "Circuit name",
"date" : ISODate("2019-04-01T23:00:00.000Z"),
"type" : "TYPE",
"agency" : {
"_id" : "5c6cfe7ae05bd9007477f7ee",
"customId" : 0,
"name" : "AGENCY NAME"
},
"trucks" : [
{
"_id" : "5c6e6f7be05bd900a1682583",
"code" : "CODE",
},
{
"_id" : "5c6cfe7ee05bd9007478018f",
"code" : "CODE NEXT",
}
],
"drivers" : [
{
"_id" : "5c7e6f7be05bd900a168264a",
"code" : "CODE D",
},
{
"_id" : "5c89fe7ee05bd90074782549",
"code" : "CODE D NEXT",
}
],
"orders" : [
{
"_id" : "5c6e7125e05bd900a1683596",
"customId" : 122116867,
"bonPassage" : "ELEC",
"date" : ISODate("2019-04-01T23:00:15.000Z"),
"state" : "closed",
"type" : "TYPE",
"circuit" : "5c6e6f7be05bd900a1682582",
"agency" : {
"_id" : "5c6cfe7ae05bd9007477f7ee",
"customId" : 0,
"name" : "AGENCY NAME"
},
"customer" : {
"_id" : "5c6cfed9e05bd90074787634",
"customId" : 0,
"nom" : "CUSTOMER NAME",
},
"places" : [
{
"_id" : "5c6d0181e05bd900747a3a71",
"customId" : 0,
"name" : "Unknown",
"agencies" : []
},
...
],
"materials" : [
{
"_id" : "5c6d024be05bd900747a542e",
"customId" : 0,
"code" : "Unknown",
"agencies" : []
},
...
],
},
...
]
}
Не могли бы вы помочь мне реализовать этот последний кусок для моего запроса и, если возможно, с хорошими показателями:)
Спасибо!