Mongoose 在更新数组中的文档时创建新的 objectId
Mongoose create new objectId while updating document inside array
以下是架构:-
Domain.add({
domainName: {type: Types.Text, required: true, initial: true, index: true},
labconfigs :{type: Types.Relationship, ref: 'LabConfig',required: false,many: true},
});
Domain.schema.add({
userlevels: {
type: [{
labId : String,
userlevel: String
}]
}
});
这是我的示例数据库,Robomongo 输出
Domain
{
"_id" : ObjectId("5900dbdb4bc4c2f82400198c"),
"domainName" : "ABC.com",
"userlevels" : [
{
"labId" : "104",
"userlevel" : "true"
},
{
"labId" : "401",
"userlevel" : "false"
},
{
"labId" : "202",
"userlevel" : "true"
},
{
"labId" : "102",
"userlevel" : "true"
}
],
"labconfigs" : [
ObjectId("5900dbdb4bc4c2f824001986"),
ObjectId("5900dbdb4bc4c2f824001987"),
ObjectId("5900dbdb4bc4c2f824001988"),
ObjectId("5900dbdb4bc4c2f824001989")
],
"__v" : 1
}
所以我所做的只是为 userlevels 字段更新我的文档(Userlevels 字段是 JSON 对象的数组)。
为了更新我的用户级别字段,所以我用 $set
给了这个下面的 Mongoose 函数
Domain.model.update( {_id: req.params.id}, {$set: {"userlevels": userauthlevel.labpublishedIDs}}, function(err, result) {
if (err) return res.apiError('database error', err);
labPublishedIDs 的值为:-
{ labpublishedIDs:
[ { labId: '102', userlevel: 'false' },
{ labId: '104', userlevel: 'true' },
{ labId: '202', userlevel: 'false' },
{ labId: '401', userlevel: 'true' } ] }
但是现在在我的更新函数之后,它为每个数组对象创建了一个新的 ObjectId。
我不明白原因。也许更新中的值已更改并且它创建了新的 ObjectId。有什么原因吗???
这是更新函数后的示例输出
/* 5 */
{
"_id" : ObjectId("5900dbdb4bc4c2f82400198d"),
"domainName" : "ABC.com",
"userlevels" : [
{
"labId" : "102",
"userlevel" : "false",
"_id" : ObjectId("5900de7ddcbe0a29fd7aaccb")
},
{
"labId" : "104",
"userlevel" : "true",
"_id" : ObjectId("5900de7ddcbe0a29fd7aacca")
},
{
"labId" : "202",
"userlevel" : "false",
"_id" : ObjectId("5900de7ddcbe0a29fd7aacc9")
},
{
"labId" : "401",
"userlevel" : "true",
"_id" : ObjectId("5900de7ddcbe0a29fd7aacc8")
}
],
"labconfigs" : [
ObjectId("5900dbdb4bc4c2f824001986"),
ObjectId("5900dbdb4bc4c2f824001987"),
ObjectId("5900dbdb4bc4c2f824001988"),
ObjectId("5900dbdb4bc4c2f824001989")
],
"__v" : 1
}
是的,这让我很痛苦,但最终我能够自己解决。
我只需要更新我的域架构以不在子文档中创建 objectId。这可以通过在您的架构中添加 _id:false 来完成。
Domain.schema.add({
userlevels: {
type: [{
_id : false,
labId : String,
userlevel: String
}]
}
});
但是还是搞不懂为什么要在子文档中添加objectId
猫鼬为什么会这样做的任何原因。
以下是架构:-
Domain.add({
domainName: {type: Types.Text, required: true, initial: true, index: true},
labconfigs :{type: Types.Relationship, ref: 'LabConfig',required: false,many: true},
});
Domain.schema.add({
userlevels: {
type: [{
labId : String,
userlevel: String
}]
}
});
这是我的示例数据库,Robomongo 输出
Domain
{
"_id" : ObjectId("5900dbdb4bc4c2f82400198c"),
"domainName" : "ABC.com",
"userlevels" : [
{
"labId" : "104",
"userlevel" : "true"
},
{
"labId" : "401",
"userlevel" : "false"
},
{
"labId" : "202",
"userlevel" : "true"
},
{
"labId" : "102",
"userlevel" : "true"
}
],
"labconfigs" : [
ObjectId("5900dbdb4bc4c2f824001986"),
ObjectId("5900dbdb4bc4c2f824001987"),
ObjectId("5900dbdb4bc4c2f824001988"),
ObjectId("5900dbdb4bc4c2f824001989")
],
"__v" : 1
}
所以我所做的只是为 userlevels 字段更新我的文档(Userlevels 字段是 JSON 对象的数组)。
为了更新我的用户级别字段,所以我用 $set
给了这个下面的 Mongoose 函数Domain.model.update( {_id: req.params.id}, {$set: {"userlevels": userauthlevel.labpublishedIDs}}, function(err, result) {
if (err) return res.apiError('database error', err);
labPublishedIDs 的值为:-
{ labpublishedIDs:
[ { labId: '102', userlevel: 'false' },
{ labId: '104', userlevel: 'true' },
{ labId: '202', userlevel: 'false' },
{ labId: '401', userlevel: 'true' } ] }
但是现在在我的更新函数之后,它为每个数组对象创建了一个新的 ObjectId。 我不明白原因。也许更新中的值已更改并且它创建了新的 ObjectId。有什么原因吗???
这是更新函数后的示例输出
/* 5 */
{
"_id" : ObjectId("5900dbdb4bc4c2f82400198d"),
"domainName" : "ABC.com",
"userlevels" : [
{
"labId" : "102",
"userlevel" : "false",
"_id" : ObjectId("5900de7ddcbe0a29fd7aaccb")
},
{
"labId" : "104",
"userlevel" : "true",
"_id" : ObjectId("5900de7ddcbe0a29fd7aacca")
},
{
"labId" : "202",
"userlevel" : "false",
"_id" : ObjectId("5900de7ddcbe0a29fd7aacc9")
},
{
"labId" : "401",
"userlevel" : "true",
"_id" : ObjectId("5900de7ddcbe0a29fd7aacc8")
}
],
"labconfigs" : [
ObjectId("5900dbdb4bc4c2f824001986"),
ObjectId("5900dbdb4bc4c2f824001987"),
ObjectId("5900dbdb4bc4c2f824001988"),
ObjectId("5900dbdb4bc4c2f824001989")
],
"__v" : 1
}
是的,这让我很痛苦,但最终我能够自己解决。 我只需要更新我的域架构以不在子文档中创建 objectId。这可以通过在您的架构中添加 _id:false 来完成。
Domain.schema.add({
userlevels: {
type: [{
_id : false,
labId : String,
userlevel: String
}]
}
});
但是还是搞不懂为什么要在子文档中添加objectId 猫鼬为什么会这样做的任何原因。