2017-08-11 125 views
0

我在express-graphQL應用程序中使用貓鼬,我有一個問題,其中我的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 
    } 
} 

whe這是我的架構定義:

book: { 
    type: BookType, 
    args: { id: { type: new GraphQLNonNull(GraphQLID) } }, 
    resolve(parentValue, { id }) { 
    return Book.find({ id }); 
    } 
}, 

當我console.log我的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查詢,但我不確定究竟是什麼。

+0

應該是'Book.findById(id);' – Teh

+0

謝謝,這不能解決它不幸的。 – coherence

回答

0

我想通了。在數據庫中創建示例文檔時,如何格式化_id參數非常重要。我是有格式爲:

"_id": "507f1f77bcf86cd799439011" 

當在現實中,貓鼬是尋找它這樣被格式化:

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

簡單地交換中立即固定它的數據庫這兩個!

0

答案取決於你的實現,但這裏要注意什麼寫這樣一行時:

return Book.find({ id }); 
  1. 在大括號前面已經提到的,你需要描述鍵和值,而不僅僅是關鍵

    {ID: 「507f1f77bcf86cd799439011」}

  2. 確保他們你在系統中具有關鍵例如火柴_id或id

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