Graphql возвращает нулевой идентификатор для запроса агрегации mongoose - PullRequest
1 голос
/ 30 сентября 2019

Graphql возвращает нулевой идентификатор для запроса агрегации mongoose, но работает нормально для других запросов mongoose.

Вот моя схема mongoose:

const { Schema } = mongoose;
const ObjectId = Schema.Types.ObjectId;

const productSchema = new Schema({
  _id: ObjectId,
  price: Number
})

const Product = mongoose.model('Product', productSchema, 'Product')

Вот моя схема Graphql:

type Product {
    id: ID
    price: String
}

Обычный запрос Graphql:

   context.Product.findOne()

Результат с console.log:

[ {
    price: 10,    
    _id: 5d7f8efebff791dcd3bb1b69
}]

Результат с graphql:

 "getSearch": [
      {
        "id": "5d7f8efebff791dcd3bb1b69",
        "price": 10,
  }]

Здесь все хорошо, Теперь проблема в запросе агрегации:

Запрос GraphQL:

context.Product.aggregate(
          [
            { $sample: { size: 1 } }
          ]
    )

Результат с console.log:

[ { _id: 5d7f8f23bff791dcd3bb1da3,
    price: 5
}]

Результат с GraphQL:

 "test": [
          {
            "id": null",
            "price": 7,
      }]

Проблема здесь такова:

  • идентификатор равен нулю
  • ответы из console.log и graphql являются разными объектами

1 Ответ

1 голос
/ 30 сентября 2019

Документы в MongoDB обычно не имеют свойства id, только свойство _id. Это показано в выводе консоли, который вы видите. Однако экземпляры модели mongoose имеют геттер для id, который возвращает значение id. Из документов :

Mongoose назначает каждой из ваших схем виртуальный метод получения идентификатора по умолчанию, который возвращает приведенное поле _id документов в строку или, в случае ObjectIds, егоhexString.

То, что возвращается такими методами, как find и findOne, является экземплярами Model , которые имеют этот метод получения. Однако использование aggregate приводит к тому, что вместо этого возвращаются простые объекты JavaScript (без метода получения).

Вы можете написать распознаватель для поля id, чтобы получить значение из id или _id:

function resolve (parent, args, context, info) {
  return parent.id || parent._id
}
...