在流星错误中删除数组中的嵌入对象

时间:2018-01-24 18:23:55

标签: mongodb meteor simple-schema

我已经研究过如何在stackoverflow和meteor论坛上删除mongodb / meteor中嵌入文档的问题。但是我无法弄清楚为什么$ pull不适合我。

几天来一直陷入这个问题。我有一个看起来像这样的集合。

{
  "_id": "N6QAJQpq4p5aYbpev",
  "name": "Test Project",
  "description": "description here",
  "organization": "xPtaobSBQwxCKAJLN",
  "members": [
    {
      "id": "3b7sbW3x487PzzJ6h",
      "role": "manager",
      "dateAdded": "2018-01-24T17:49:50.734Z"
    },
    {
      "id": "n72PveQmdjcsvv5t5",
      "role": "manager",
      "dateAdded": "2018-01-24T17:49:53.545Z"
    },
    {
      "id": "dSqzezqQjrzLeSTEw",
      "role": "manager",
      "dateAdded": "2018-01-24T17:50:11.177Z"
    }
  ]
}`

我更新记录的方法:

removeUserFromProj: (projId, memberId) =>{
  Projects.update({ _id: projId }, {
     $pull: { "members": { id: memberId } }
     // $pull: { "members.id":  memberId  }
  },
     function (error, success) {
        if (error) {
           console.log('error: ', error);
        }
        if (success) {
           console.log('updating user role: ' + success);
        }
     });

}

回调函数给了我一个成功

enter image description here

但该集合未更新。

如果我使用这种语法// $pull: { "members.id": memberId },它会给我这个错误说:

simulating the effect of invoking 'removeUserFromProj' Error: After filtering out keys not in the schema, your modifier is now empty

我也尝试使用$ pop而不是$ pull。它正在删除我的收藏中的最后一条记录。

enter image description here

我正在使用meteor SimpleSchema。

1 个答案:

答案 0 :(得分:0)

发现我的错误。看起来我的架构中的autoValue属性阻止我更新我的

OrganizationSchema = new SimpleSchema({
       name: {
          type: String,
          label: "Organization Name"
       },
       createdAt: {
          type: Date,
          autoValue: function(){
             return new Date()
          }  
       },
       createdBy:{
          type: String
       },
       members: {
          type: [Member],
          optional: true
       }
    });

将autoValue属性更改为

createdAt: {
   type: Date,
   autoValue: function(){
             return new Date()
   }  
}

defaultProperty解决了我的问题:

createdAt: {
      type: Date,
      defaultValue:  new Date()
   },