mon goose find не возвращает do c, в то время как compass возвращает - PullRequest
0 голосов
/ 25 мая 2020

Цель

Получение продуктов по идентификатору категории из коллекции mongoDB 'products' с использованием mon goose .find

Ожидаемые и фактические результаты

Все документы, имеющие соответствующую категорию, должны возвращаться с ограниченным числом, но вместо этого я получаю пустой массив. Я попытался сделать запрос с помощью компаса mongodb - он работал, как ожидалось. Я даже пробовал свой код для поиска документов по идентификатору (сработало), названию (сработало) и цене (не сработало). Не удается найти начало проблемы root.

Код

Схема и модель продукта:

const mongoose = require('mongoose');

const productSchema = new mongoose.Schema({
  title: {
    type: String,
    required: true,
  },
  thumbnail: {
    type: String,
    required: true,
  },
  price: {
    type: Number,
    required: true,
  },
  category: {
    type: mongoose.Types.ObjectId,
    required: true,
  },
  rating: {
    type: Number,
    default: 0,
  },
  voters: {
    type: Number,
    default: 0,
  },
});

.
.
.

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

module.exports = { Product, ... };

Решатель:

products: (_, { limit, category }) => {
      console.log(mongoose.Types.ObjectId('5ec120a9fc13ae248f000004')); // Works fine
      Product.find({ category: mongoose.Types.ObjectId(category) }) // Tried also as a simple string, still not working
        .limit(limit)
        .exec((err, products) => {
          if (err) console.log(err);
          console.log(products);
        });
      if (category) return Product.find({ category }).limit(limit);
      return Product.find({}).limit(limit);
    },

Результат, записанный в консоли:

5ec120a9fc13ae248f000004
[]

Образец коллекции 'продукты':

{
    "_id": {
        "$oid": "5ec129e55db26438fcdb9b01"
    },
    "title": "Ecolab - Lime - A - Way 4/4 L",
    "category": "5ec120a9fc13ae248f000004",
    "thumbnail": "https://source.unsplash.com/350x390/?Automotive",
    "price": "236.13",
    "rating": 878210,
    "voters": 2668388
},
{
    "_id": {
        "$oid": "5ec129e55db26438fcdb9b02"
    },
    "title": "Mushrooms - Black, Dried",
    "category": "5ec120a9fc13ae248f000001",
    "thumbnail": "https://source.unsplash.com/350x390/?Sports",
    "price": "439.85",
    "rating": 549879,
    "voters": 2375685
},
{
    "_id": {
        "$oid": "5ec129e55db26438fcdb9b03"
    },
    "title": "Dried Figs",
    "category": "5ec120a9fc13ae248f000004",
    "thumbnail": "https://source.unsplash.com/350x390/?Automotive",
    "price": "202.60",
    "rating": 925701,
    "voters": 2740499
}

1 Ответ

0 голосов
/ 26 мая 2020

TL; DR: вам необходимо преобразовать данные в полях price и category в вашей базе данных в Number и ObjectId

, когда вы запрашиваете данные с помощью Mon goose убедитесь, что все типы данных соответствуют :

  1. Типы данных поля, которое вы запрашиваете, совпадает с вашим schema

При некоторой операции (например, агрегации, где mon goose не может легко вывести типы) mon goose поможет преобразовать его для вас в соответствии со схемой, но не всегда. Лучше всегда конвертировать значения самостоятельно, чтобы избежать подобных сюрпризов.

Типы данных данных сохраненных в базе данных фактически соответствуют тому, что вы указываете в своей схеме .

Ваша схема могла измениться, убедитесь, что вы перенесли и преобразовали данные соответствующим образом. Поскольку mon goose иногда преобразует значения для вас, если сохраненные данные не соответствуют схеме, они не будут соответствовать тому, что вы пытаетесь запросить.

Из вывода вашей базы данных мы можем сделать это "price": "236.13" и "category": "5ec120a9fc13ae248f000004" сохраняются как Strings, а не Number и ObjectId, как предполагалось. Из "rating": 878210 и "_id": { "$oid": "5ec129e55db26438fcdb9b01" } видно, как представлены Number и ObjectId.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...