2017-08-11 52 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查询可能会失败。