Агрегация MongoDB как предоставить массив идентификаторов, а затем вернуть документы, в которых массив идентификаторов имеет хотя бы одно совпадение идентификаторов

#mongodb #aggregation-framework

#mongodb #агрегация-фреймворк

Вопрос:

Я использую область MongoDB и имею функцию, которая выдает массив идентификаторов строк.

Затем, используя конвейер агрегации, я хочу вернуть все документы из коллекции, где их массив идентификаторов объектов, называемый ‘categoryIds’, содержит по крайней мере один из этих строковых идентификаторов.

    if (categories) {
    pipeline.push(
      {
        $project: {
          categoryObjectIds: { $map: { input: categories, as: 'category', in: { "$toObjectId": "$category" } } }
        }
      },
      {
        $match: {
          "categoryIds": {
            "$in": '$categoryObjectIds'
          }
        }
      }
    );
  }
 

В настоящее время я пытаюсь сказать, если был предоставлен массив строк (категории), доведите эти этапы до конца конвейера.

Первый этап — преобразовать массив строк в массив идентификаторов объектов, второй — попытаться сопоставить документы, идентификаторы категорий которых включают хотя бы один из этих идентификаторов из первого массива.

Когда я запускаю это, я получаю «(BadValue) $in нуждается в массиве», что я здесь делаю не так?

Обновить

 {
    "_id": {
        "$oid": "5faff3f5a87269ccfb8fd502"
    },
    "name": "Albert's Schloss",
    "categoryIds": [{
        "$oid": "5faff41da87269ccfb8fd503"
    }, {
        "$oid": "5faff42ca87269ccfb8fd504"
    }],
    "aggregateRating": {
        "$numberDecimal": "4.8"
    },
    "photoURL": "",
    "location": {
        "type": "Point",
        "coordinates": [{
            "$numberDecimal": "53.478214"
        }, {
            "$numberDecimal": "-2.247828"
        }]
    },
    "openingTimes": {
        "monday": {
            "openingTime": {
                "$date": "0001-01-01T09:00:00.000Z"
            },
            "closingTime": {
                "$date": "0001-01-01T23:00:00.000Z"
            }
        },
        "tuesday": {
            "openingTime": {
                "$date": "0001-01-01T09:00:00.000Z"
            },
            "closingTime": {
                "$date": "0001-01-01T23:00:00.000Z"
            }
        },
        "wednesday": {
            "openingTime": {
                "$date": "0001-01-01T09:00:00.000Z"
            },
            "closingTime": {
                "$date": "0001-01-01T23:00:00.000Z"
            }
        },
        "thursday": {
            "openingTime": {
                "$date": "0001-01-01T09:00:00.000Z"
            },
            "closingTime": {
                "$date": "0001-01-01T23:00:00.000Z"
            }
        },
        "friday": {
            "openingTime": {
                "$date": "0001-01-01T09:00:00.000Z"
            },
            "closingTime": {
                "$date": "0001-01-01T23:00:00.000Z"
            }
        },
        "saturday": {
            "openingTime": {
                "$date": "0001-01-01T09:00:00.000Z"
            },
            "closingTime": {
                "$date": "0001-01-01T23:00:00.000Z"
            }
        },
        "sunday": {
            "openingTime": {
                "$date": "0001-01-01T09:00:00.000Z"
            },
            "closingTime": {
                "$date": "0001-01-01T23:00:00.000Z"
            }
        }
    }
}
 

Это пример документа, если, например, я предоставляю функцию, categories = ['5faff41da87269ccfb8fd503']; я бы ожидал, что этот документ вернется в результате, потому что его массив categoryIds содержит один из идентификаторов, которые я предоставил

Комментарии:

1. Не могли бы вы предоставить образец документа и желаемый результат?

2. Я привел пример документа. Если, например, я предоставляю функцию, categories = ['5faff41da87269ccfb8fd503']; я бы ожидал, что этот документ вернется в результате, потому что его массив categoryIds содержит один из идентификаторов, которые я предоставил