【问题标题】:Mongoose create new objectId while updating document inside arrayMongoose 在更新数组内的文档时创建新的 objectId
【发布时间】:2017-09-24 07:03:03
【问题描述】:

以下是架构:-

  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
}

【问题讨论】:

    标签: mongodb mongoose mongodb-query keystonejs


    【解决方案1】:

    是的,这让我很痛苦,但最后我能够自己解决。 我只需要更新我的域模式以不在子文档中创建 objectId。这可以通过在架构中添加 _id:false 来完成。

    Domain.schema.add({
      userlevels: {
        type: [{
          _id : false,
          labId : String,
          userlevel: String
        }]
      }
    });
    

    但仍然无法弄清楚为什么它在子文档中添加了 objectId 猫鼬会这样做的任何原因。

    【讨论】:

      猜你喜欢
      • 2017-01-19
      • 2014-11-03
      • 2021-04-08
      • 1970-01-01
      • 2019-10-05
      • 2016-10-06
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多