我正在使用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")。我做错了什么?
谢谢大家!
2条答案
按热度按时间7ivaypg91#
Mongodb是一个nosql数据库,这意味着数据库中的每个对象都应该包含一个ID和修订值。一旦发生更新,修订值就会作为更新过程的一部分发生变化,以实现对数据对象所做的更改。由于您的数据对象没有修订值,因此ID值会发生变化。因为它是唯一的。现在我“我不是mongo的Maven,但是你应该查看一下关于如何持久化数据对象的文档,并做出相应的修改
acruukt92#
如果有人登陆这里(尽管这是老帖子),问题可能在于试图更新整个
phones
对象,而被覆盖的_id
是其中的一部分。因为在mongoose中有一个为phones
定义的模型,所以每当一个全新的phones
对象被创建时,它都会试图创建一个新的_id
。想要保持相同id的人只需要
$set
他们想要更改的字段,而不是整个对象。可以改为