【问题标题】:mongoose find doesn't return any doc, while compass doesmongoose find 不返回任何文档,而 compass 则
【发布时间】:2020-09-12 05:08:27
【问题描述】:

目标

使用 mongoose.find 从 mongoDB 'products' 集合中按类别 id 获取产品

预期和实际结果

所有具有匹配类别的文档都应该在限制数量内返回,但我收到的是一个空数组。 我尝试使用 mongodb 的指南针进行查询 - 它按预期工作。我什至尝试了我的代码来使用 id(worked)、title(worked) 和 price(没用) 来查找文档。找不到问题根的开头。

代码

产品架构和型号:

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
}

【问题讨论】:

  • 您的架构中定义的pricecategory 的类型似乎与数据库中的类型不一致。从罗盘输出中您可以看到它们存储为Strings,而它们被定义为NumberObjectId
  • @thammada 正如我所写,我还尝试将类别作为简单字符串发送到查找函数,但仍然没有获取文档
  • 是的,但是由于您的架构不同,它将被转换。您需要更改架构以匹配您的数据,或更新您的数据以匹配您的架构
  • 你是对的!我将集合中的所有类别字段都转换为 ObjectID 类型并且它有效。谢谢@thammada

标签: node.js mongodb express mongoose


【解决方案1】:

TL;DR:您必须将数据库中pricecategory 字段中的数据转换为NumberObjectId

当您使用 Mongoose 查询数据时,请确保 数据类型全部匹配

  1. 您正在查询的字段的数据类型与您的模式相匹配

通过一些操作(比如聚合,mongoose 不能轻易推断出类型),mongoose 会帮你转换 根据架构,但并非总是如此。最好总是 自己转换值以避免这样的意外。

  1. 数据库中存储的数据的数据类型实际上与您在架构中指定的内容相匹配。

您的架构可能已更改,请确保相应地迁移和转换数据。由于 mongoose 有时会为您转换值,因此如果存储的数据与架构不匹配,它将与您尝试查询的内容不匹配。

从您的数据库输出中,我们可以推断出"price": "236.13""category": "5ec120a9fc13ae248f000004" 存储为Strings 而不是NumberObjectId。我们可以从"rating": 878210"_id": { "$oid": "5ec129e55db26438fcdb9b01" }看到NumberObjectId是如何表示的。

【讨论】:

    猜你喜欢
    • 2019-03-19
    • 1970-01-01
    • 2018-02-27
    • 2017-04-17
    • 2018-10-02
    • 2020-05-13
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    相关资源
    最近更新 更多