Mongoose find 可以返回所有但不仅仅是一个
Posted
技术标签:
【中文标题】Mongoose find 可以返回所有但不仅仅是一个【英文标题】:Mongoose find can return all but not just one 【发布时间】:2018-01-20 04:50:33 【问题描述】:我在 express-graphQL 应用程序中使用 mongoose,我遇到了一个问题,我的 find()
查询按预期返回,但我无法让我的 find(id)
查询返回除 null 之外的任何内容。这种堆栈溢出搜索的最高结果表明这是模型上的多元化问题,虽然可能是这种情况,但我不相信这是因为我可以让 find-all 功能正常工作我的模型的奇异用法。这个查询:
books
id
使用此架构:
books:
type: new GraphQLList(BookType),
resolve()
return Book.find();
返回以下内容:
"data":
"books": [
"id": "507f1f77bcf86cd799439011"
,
"id": "507f1f77bcf86cd799439012"
]
相比之下,此查询返回 null
作为账面价值:
book(id:"507f1f77bcf86cd799439011")
id
这是我的架构定义:
book:
type: BookType,
args: id: type: new GraphQLNonNull(GraphQLID) ,
resolve(parentValue, id )
return Book.find( id );
,
当我在该解析函数中控制台记录我的 id 参数时,它会按预期返回 id。我曾尝试使用 mongoose.Types.ObjectId(id) 作为强制它作为 id 而不是字符串的方法,但这似乎没有帮助。这就是我的模型的样子,注意我没有定义我的 id,在我的实际数据库中,id 字段输入为_id
,即使我在查询中通过id
调用它。
import mongoose from "mongoose";
const Schema = mongoose.Schema;
const BookSchema = new Schema(
name: type: String ,
);
mongoose.model("Book", BookSchema);
编辑:经过更多研究,我发现这个 findOne 有效:
Book.findOne( name: "title" );
虽然其中任何一个都没有:
Book.findOne( id: "507f1f77bcf86cd799439011" );
Book.findOne( id );
这清楚地指出了我如何格式化我的 id 查询的一些问题,但我不确定到底是什么。
【问题讨论】:
应该是Book.findById(id);
谢谢,不幸的是,这并没有解决问题。
【参考方案1】:
我想通了。在数据库中创建示例文档时,_id 参数的格式非常重要。我把它格式化为:
"_id": "507f1f77bcf86cd799439011"
实际上,猫鼬正在寻找这样的格式:
"_id":
"$oid": "507f1f77bcf86cd799439011"
,
只需在数据库中交换这两个即可立即修复它!
【讨论】:
【参考方案2】:答案取决于您的实现,但以下是编写这样的行时要注意的事项:
return Book.find( id );
如前所述,在花括号中,您需要描述键和值,而不仅仅是键,例如
id: "507f1f77bcf86cd799439011"
确保它们的密钥与系统中的密钥匹配,例如_id 或 id
该值可以表示为字符串或 ObjectId..根据需要使用 ObjectId 从字符串转换(不确定 mongoose 是否对此宽容,但 mongodb 原生驱动程序不会。我相信最佳实践应该是将所有值存储为 ObjectId,并在所有查询中将字符串转换为 ObjectId)。 小心依赖于 find 和 findOne 的代码...第一个将返回一个数组(即使它是一个对象的数组)。使用结果的代码(例如客户端)可能需要一个或另一个,因此当问题确实与解析数据有关时,find / findOne 查询可能会失败。【讨论】:
以上是关于Mongoose find 可以返回所有但不仅仅是一个的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose 没有使用简单的 find() 返回文档中的所有字段