Сравните два значения в документе и отобразите общие значения в каждой строке в результате

#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"
    }
  ]
}