mongoose 方法findOneAndUpdate更改数组中我的元素的id

1rhkuytd  于 2023-01-26  发布在  Go
关注(0)|答案(2)|浏览(233)

我正在使用mongoDB,mongoose和graphQL。我正在尝试更新我的数据库。
我正在更新一个名为phones的数组,更改工作正常,唯一的问题是当更新结束时,objectId的值发生了变化。

//模型-〉架构组织

const organizationSchema = new mongoose.Schema({  
 name: String,
 address: String,
 phones: [
  {
   number: Number,
   prefix: Number
  }
 ],
 email: String
})

//类型-〉组织

type Response {
    success: Boolean!
    token: String   
    errors: [Error]
}

type Error {
    path: String!
    message: String!
}

input iOrganization {
    _id: ID
    arrID: ID
    address: String        
    email: String        
    number: Int
    prefix: Int
    name: String
}

type Mutation {      
    updateOrgGeneric(iOrg: iOrganization): Response!
}
  • //冲突解决程序-〉组织(第一种方式)*
Mutation: {
    updateOrgGeneric:  (parent, args, {models}) => {      
        return models.Organization.findOneAndUpdate(
            { "_id": args.iOrg._id, "phones._id": args.iOrg.arrID },
            {  $set: { "phones.$": { number: args.iOrg.number, prefix: args.iOrg.prefix }} },
            {new: true}                
        )
        .then((resp) => {         
            console.log(resp);

            return {
                success: true,
                errors: []
            }  
        })
        .catch((error) => {
            return {
                success: false,
                errors: error
            };    
        })
    },
}
  • //冲突解决程序-〉组织(第二种方式)*
Mutation: {
    updateOrgGeneric:  (parent, args, {models}) => {      
        return models.Organization.findOneAndUpdate(
            { "_id": args.iOrg._id },
            {  $set: { "phones.$[arr]": { number: args.iOrg.number, prefix: args.iOrg.prefix }} },
            {new: true}
            { arrayFilters:[{ "arr._id": mongoose.Types.ObjectId(args.iOrg.arrID) }], new: true}                
        )
        .then((resp) => {         
            console.log(resp);

            return {
                success: true,
                errors: []
            }  
        })
        .catch((error) => {
            return {
                success: false,
                errors: error
            };    
        })
    }
}

//Playground(http://localhost:5000/graphql

mutation {
 updateOrgGeneric(
   iOrg: {
    _id: "5bdbee1b794b972bc8562aeb"             
    arrID: "5bdcea7cae88be098c020b19"
    number: 85239,
    prefix: 862 
   }
 ){
   success
   errors {
    path
    message
   }
 }
}

both_id与arrID一样存在于BD中。
在操场示例中,初始arrID为:_id:ObjectId("5bdcea7cae88be098c020b19"),但更新后是另一个,例如:_id:对象Id("5bdcec0a2ab78533b4bd1d98")。我做错了什么?
谢谢大家!

7ivaypg9

7ivaypg91#

Mongodb是一个nosql数据库,这意味着数据库中的每个对象都应该包含一个ID和修订值。一旦发生更新,修订值就会作为更新过程的一部分发生变化,以实现对数据对象所做的更改。由于您的数据对象没有修订值,因此ID值会发生变化。因为它是唯一的。现在我“我不是mongo的Maven,但是你应该查看一下关于如何持久化数据对象的文档,并做出相应的修改

acruukt9

acruukt92#

如果有人登陆这里(尽管这是老帖子),问题可能在于试图更新整个phones对象,而被覆盖的_id是其中的一部分。因为在mongoose中有一个为phones定义的模型,所以每当一个全新的phones对象被创建时,它都会试图创建一个新的_id
想要保持相同id的人只需要$set他们想要更改的字段,而不是整个对象。

{  $set: { "phones.$[arr]": { number: args.iOrg.number, prefix: args.iOrg.prefix }} }

可以改为

{  $set: { "phones.$[arr].number": args.iOrg.number, "phones.$[arr].prefix": args.iOrg.prefix } }

相关问题