【问题标题】:MongoDB not updating in node js using graphqlMongoDB 未使用 graphql 在节点 js 中更新
【发布时间】:2020-02-06 09:46:22
【问题描述】:

我正在前端的 graphql 中进行更新突变

mutation updateSetting($updateSetting:CoSettingInput,$id:String) {
     updateConSettings(input:$updateSetting,settingId:$id){
         _id                        
         Local                        
         Token
         Credentials
         Port
         Host
         Auth                        
     }
} 

从前端为graphql传递的变量

{
  "updateSetting": {
     "Local " :"asdasdkk"                      
     "Token":"asdasdkk"    
     "Credentials":"asdasdkk"    
     "Port":"asdasdkk"    
     "Host":"asdasdkk"    
     "Auth" :"asdasdkk"    
   },
   "id": "5d96e98e7a921f0414619ad1"
}

节点js中的后端MongoDB查询

input CoSettingInput{
    Local                        
    Token
    Credentials
    Port
    Host
    Auth 
}
updateConSettings(input:ConSettingInput,settingId:String):ConSettings
    async updateConSettings(root,{
       input,
       settingId
    }){
       console.log(input,settingId)
       const updateSetting=await ConSchema.updateOne(
           {_id:ObjectId(settingId)},
           {CoSettingInput:input}                
       ).exec();
            console.log("ErrorupdateSetting",updateSetting)
            if(!updateSetting){
                throw new Error("Error- Cannot update the setting")
            }
       return updateSetting
    }

我已经控制台并在后端接收数据,但它没有更新。

            {ok:0,n:0,nModified:0}

我谷歌一无所获,我也没有发现任何错误来破解解决方案。 我被困了3天:( 谁能让我知道我哪里出错了?

【问题讨论】:

  • {ok:0,n:0,nModified :0 } 它可以找到给定查询的匹配文档。所以检查{_id:ObjectId(settingId)} 是否正确构建
  • @Subburaj 是的,它正在接收 id。如何检查结构是否正确?
  • 你能不能console.log(ObjectId(settingId))看看它的打印效果如何
  • @Subburaj 我会控制台那是 -> settingId,ObjectId(settingId) -> '5d96e98e7a921f0414619ad1' 5d96e98e7a921f0414619ad1 -> 我收到虽然收到它没有更新
  • 确定 MongoDB 中有这个 id 数据吗?我的猜测是 ObjectId 正在制造问题

标签: node.js mongodb graphql


【解决方案1】:

您在查询中错过了 $set 尝试以下内容

ConSchemas.updateOne(
           {_id:ObjectId(settingId)},
           {$set:{CoSettingInput:input}})      

$set 将适用于您可以使用的整个文档更新的单个密钥

ConSchemas.replaceOne(
               {_id:ObjectId(settingId)},
               {CoSettingInput:input})     

但在 replaceOne 中,您将丢失所有以前的密钥,只会更新新的。

【讨论】:

    猜你喜欢
    • 2015-09-10
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多