node.js - mongoose find 不返回任何文档,而 compass 则
问题描述
目标
使用 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
}
解决方案
TL;DR:您必须将字段price
和category
数据库中的数据转换为Number
和ObjectId
当您使用 Mongoose 查询数据时,请确保数据类型全部匹配:
- 您正在查询的字段的数据类型与您的架构匹配
通过一些操作(如聚合,mongoose 无法轻易推断类型),mongoose 将帮助您根据模式转换它,但并非总是如此。最好总是自己转换值以避免这样的意外。
- 存储在数据库中的数据的数据类型实际上与您在模式中指定的数据类型相匹配。
您的架构可能已更改,请确保相应地迁移和转换数据。由于 mongoose 有时会为您转换值,因此如果存储的数据与架构不匹配,它将与您尝试查询的内容不匹配。
从您的数据库输出中,我们可以推断出这一点"price": "236.13"
,并且"category": "5ec120a9fc13ae248f000004"
存储为Strings
不存储Number
和ObjectId
应该存储。我们可以从"rating": 878210
,以及"_id": { "$oid": "5ec129e55db26438fcdb9b01" }
如何表示Number
和ObjectId
表示。
推荐阅读
- angular - 标签上的 Angular 'for' 属性仅适用于第一个输入
- c# - 将 JSON 反序列化为列表
- android - 在 kotlin 上,textview 未在 onCreate 方法之外初始化
- reactjs - TypeError: Object (...) is not a function; applyMiddleware(thunk.withExtraArgument({getFirebase, getFirestore})),报错的解决方法是什么?
- list - Robotframework:如何使用一个列表中的值作为另一个列表名称的一部分
- hyperledger-fabric - 在超级账本结构中,1.2v 和 2.0v 之间的主要区别是什么?
- node.js - 创建我自己的 Node.js 包克隆(修复了一个错误)
- python - 如何在 matplotlib.pyplot 中的第一个图后面添加第二个图?它要么在顶部,要么不可见
- java - Selenium 错误:没有这样的元素:无法在 .isDisplayed() 方法上找到元素
- graphql - 如何将字段列表片段插值移动到括号之外