【问题标题】:Mongoose find can return all but not just oneMongoose find 可以返回所有但不仅仅是一个
【发布时间】: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);
  • 谢谢,不幸的是,这并没有解决问题。

标签: node.js mongodb mongoose graphql mongoose-schema


【解决方案1】:

我想通了。在数据库中创建示例文档时,_id 参数的格式非常重要。我把它格式化为:

"_id": "507f1f77bcf86cd799439011"

实际上,猫鼬正在寻找这样的格式:

"_id": {
    "$oid": "507f1f77bcf86cd799439011"
},

只需在数据库中交换这两个即可立即修复它!

【讨论】:

    【解决方案2】:

    答案取决于您的实现,但以下是编写这样的行时要注意的事项:

    return Book.find({ id });
    
    1. 如前所述,在花括号中,您需要描述键和值,而不仅仅是键,例如

      { id: "507f1f77bcf86cd799439011" }

    2. 确保它们的密钥与系统中的密钥匹配,例如_id 或 id

    3. 该值可以表示为字符串或 ObjectId..根据需要使用 ObjectId 从字符串转换(不确定 mongoose 是否对此宽容,但 mongodb 原生驱动程序不会。我相信最佳实践应该是将所有值存储为 ObjectId,并在所有查询中将字符串转换为 ObjectId)。
    4. 小心依赖于 find 和 findOne 的代码...第一个将返回一个数组(即使它是一个对象的数组)。使用结果的代码(例如客户端)可能需要一个或另一个,因此当问题确实与解析数据有关时,find / findOne 查询可能会失败。

    【讨论】:

      猜你喜欢
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 2019-09-22
      相关资源
      最近更新 更多