簡體   English   中英

貓鼬發現可以退還全部,但不能只退還一個

[英]Mongoose find can return all but not just one

我在express-graphQL應用程序中使用貓鼬,並且遇到一個問題,我的find({})查詢按預期返回,但是我無法讓我的find({id})查詢返回除null之外的任何內容。 此類關於堆棧溢出的搜索的最高結果將表明這是模型上的多元化問題,盡管可能是這種情況,但我不相信這是因為我可以使全部查找功能正常工作我模型的單一用法。 該查詢:

{
  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 });
  }
},

當我在該resolve函數中console.log我的id參數時,它按預期返回ID。 我嘗試使用mongoose.Types.ObjectId(id)作為強制將其作為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查詢的一些問題,但是我不確定到底是什么。

我想到了。 在數據庫中創建樣本文檔時,_id參數的格式非常重要。 我將其格式化為:

"_id": "507f1f77bcf86cd799439011"

實際上,貓鼬正在尋找要格式化的格式:

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

只需交換數據庫中的這兩個即可立即修復!

答案取決於您的實現,但是這是編寫這樣的行時要注意的事項:

return Book.find({ id });
  1. 在已經提到的花括號中,您需要描述鍵和值,而不僅僅是鍵,例如

    {id:“ 507f1f77bcf86cd799439011”}

  2. 確保它們的密鑰與您系統中的密鑰匹配,例如_id或id

  3. 該值可以表示為字符串或ObjectId ..根據需要使用ObjectId從字符串轉換(不確定mongoose是否對此寬容,但mongodb本機驅動程序不是。我相信最佳實踐應該是存儲所有值作為ObjectIds,並在所有查詢中將字符串轉換為ObjectId)。
  4. 注意依賴於find vs findOne的代碼...第一個將返回一個數組(即使它是一個對象的數組)。 消費結果的代碼(例如客戶端)可能期望一個或另一個,因此當問題確實與解析數據有關時,似乎find / findOne查詢失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM