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 可以返回所有但不仅仅是一个的主要内容,如果未能解决你的问题,请参考以下文章

如何从 find 方法返回 Mongoose 结果?

Mongoose 没有使用简单的 find() 返回文档中的所有字段

mongoose.find() 每次都不返回

mongoose - 如何使用带有请求参数数组的 $in 进行 .find()现在它只返回空数组

Mongoose:.find() 不返回任何文档

更新 findOne()/find()/findById() 返回的文档 - mongoose