#mongodb #mongodb-query #aggregation-framework
#mongodb #mongodb-запрос #агрегация-фреймворк
Вопрос:
У меня есть документы, в которых я храню два основных объекта scan и result, я хочу, чтобы результат был таким, чтобы в результате я получал отдельную строку для каждого совпадения scan.location и result.location.
Дата:
{
"_id" : ObjectId("6024d02a1bf5152b44baf521"),
"scan" : {
"customerId" : "e2565eac-2086-48fc-ba18-dbce74602e22",
"customerGenderSelection" : "F",
"scanQuery" : {
"service" : "MA",
"date" : "08-Nov-2020",
"locations" : [
{
"locationId" : "0023",
"locationName" : "dobson"
},
{
"locationId" : "0001",
"locationName" : "shea"
}
]
},
"sessionId" : "70511849-97f8-4318-a96e-bb3a573c52ea",
},
"result" : [
{
"employeeId" : "224f55b2-27bc-4e34-8249-a8d201540ac2",
"time" : "11:00",
"locationId" : "0023"
},
{
"employeeId" : "224f55b2-27bc-4e34-8249-a8d201540ac2",
"time" : "12:00",
"locationId" : "0023"
},
{
"employeeId" : "224f55b2-27bc-4e34-8249-a8d201540ac2",
"time" : "12:30",
"locationId" : "0023"
},
{
"employeeId" : "224f55b2-27bc-4e34-8249-a8d201540ac2",
"time" : "13:00",
"locationId" : "0001"
}
]
}
Я хочу результат, где scan.scanQuery.locations.LocationID == result.LocationID . Поэтому ожидайте результат в приведенном ниже формате:
Ожидаемый ответ:
{
"scan" : {
"customerId" : "e2565eac-2086-48fc-ba18-dbce74602e22",
"customerGenderSelection" : "F",
"scanQuery" : {
"service" : "MA",
"date" : "08-Nov-2020",
"locations" : [
{
"locationId" : "0023",
"locationName" : "dobson"
}
]
},
"sessionId" : "70511849-97f8-4318-a96e-bb3a573c52ea",
},
"result" : [
{
"employeeId" : "224f55b2-27bc-4e34-8249-a8d201540ac2",
"time" : "11:00",
"locationId" : "0023"
},
{
"employeeId" : "224f55b2-27bc-4e34-8249-a8d201540ac2",
"time" : "12:00",
"locationId" : "0023"
},
{
"employeeId" : "224f55b2-27bc-4e34-8249-a8d201540ac2",
"time" : "12:30",
"locationId" : "0023"
}
]
},
{
"scan" : {
"customerId" : "e2565eac-2086-48fc-ba18-dbce74602e22",
"customerGenderSelection" : "F",
"scanQuery" : {
"service" : "MA",
"date" : "08-Nov-2020",
"locations" :
{
"locationId" : "0001",
"locationName" : "shea"
}
]
},
"sessionId" : "70511849-97f8-4318-a96e-bb3a573c52ea",
},
"result" : [
{
"employeeId" : "224f55b2-27bc-4e34-8249-a8d201540ac2",
"time" : "13:00",
"locationId" : "0001"
}
]
}
Любые предложения или идеи были бы полезны.
Комментарии:
1. docs.mongodb.com/manual/reference/operator/aggregation/eq либо в запросе агрегации, либо с помощью docs.mongodb.com/manual/reference/operator/query/expr в запросе поиска
2. Я новичок в mongodb, я перепробовал много способов, используя unwind агрегации, project и eq, а также expr, но не смог получить желаемый результат.
Ответ №1:
Попробуй это:
db.locations.aggregate([
{
$unwind: "$scan.scanQuery.locations"
},
{
$addFields: {
result: {
$filter: {
input: "$result",
as: "item",
cond: {
$eq: ["$scan.scanQuery.locations.locationId", "$item.locationId"]
}
}
}
}
}
]);
Вывод:
{
"_id": ObjectId("6024d02a1bf5152b44baf521"),
"scan": {
"customerId": "e2565eac-2086-48fc-ba18-dbce74602e22",
"customerGenderSelection": "F",
"scanQuery": {
"service": "MA",
"date": "08-Nov-2020",
"locations": {
"locationId": "0023",
"locationName": "dobson"
}
},
"sessionId": "70511849-97f8-4318-a96e-bb3a573c52ea"
},
"result": [
{
"employeeId": "224f55b2-27bc-4e34-8249-a8d201540ac2",
"time": "11:00",
"locationId": "0023"
},
{
"employeeId": "224f55b2-27bc-4e34-8249-a8d201540ac2",
"time": "12:00",
"locationId": "0023"
},
{
"employeeId": "224f55b2-27bc-4e34-8249-a8d201540ac2",
"time": "12:30",
"locationId": "0023"
}
]
},
{
"_id": ObjectId("6024d02a1bf5152b44baf521"),
"scan": {
"customerId": "e2565eac-2086-48fc-ba18-dbce74602e22",
"customerGenderSelection": "F",
"scanQuery": {
"service": "MA",
"date": "08-Nov-2020",
"locations": {
"locationId": "0001",
"locationName": "shea"
}
},
"sessionId": "70511849-97f8-4318-a96e-bb3a573c52ea"
},
"result": [
{
"employeeId": "224f55b2-27bc-4e34-8249-a8d201540ac2",
"time": "13:00",
"locationId": "0001"
}
]
}