2016-03-21 139 views
0

我的文档应该看起来像这样,一个id最多有20个workCenters,每个workCenter可能有几个问题。只要身份证进入下一个工作中心,每个工作中心阵列就会关闭或阻塞以便进一步输入。mongodb upsert/addToSet/embedded文档

{ 
    _id: "C7700258wcL4MSB050", 
    WorkCenters: [ 
    { 
     workCenter: "L4MSB050", 
     Issues: [ 
     { 
      issueType: "Material Movement", 
      issueDuration: 14 
     }, 
     { 
      issueType: "Communication COA", 
      issueDuration: 20 
     }, 
     { 
      issueType: "Lack of Tool", 
      issueDuration: 12 
     } 
     ] 
    }, 
    { 
     workCenter: "L4MSB060", 
     Issues: [ 
     { 
      issueType: "Material Movement", 
      issueDuration: 14 
     }, 
     { 
      issueType: "Communication COA", 
      issueDuration: 20 
     }, 
     { 
      issueType: "Lack of Tool", 
      issueDuration: 12 
     } 
     ] 
    } 
    ] 
} 

我至今现在是:

TaktIssue.update({_id: centerId}, {$addToSet: {WorkCenters: {workCenter: workCenter, Issues: {issueType: issueType, issueDuration: minutes_2}}}}); 

这就是我想要的......

{ 
    _id: "C7700254workCenter", 
    WorkCenters: [ 
    { 
     workCenter: "L4MSB010", 
     Issues: { 
     issueType: "Tech Error", 
     issueDuration: 0 
     } 
    } 
    ] 
} 

但对同一工作中心的第二项是一个完整的添加到第一个条目,而不仅仅是问题类型和时间。 而新的工作中心不会添加新阵列。

{ 
    _id: "C7700254workCenter", 
    WorkCenters: [ 
    { 
     workCenter: "L4MSB010", 
     Issues: { 
     issueType: "Tech Error", 
     issueDuration: 0 
     } 
    }, 
    { 
     workCenter: "L4MSB010", 
     Issues: { 
     issueType: "Lack of Tool", 
     issueDuration: 0 
     } 
    }, 
    { 
     workCenter: "L4MSB020", 
     Issues: { 
     issueType: "Material Movement", 
     issueDuration: 0 
     } 
    }, 
    { 
     workCenter: "L4MSB020", 
     Issues: { 
     issueType: "Tech Error", 
     issueDuration: 0 
     } 
    } 
    ] 
} 

我希望它的中途清楚我喜欢做什么。 任何帮助或提示高度赞赏。 感谢

+0

其实这是不** **你想在所有的东西。请注意''问题“'包含一个”对象“'{}'而不是一个数组'''''。而这一点应该向你强调这个问题。有趣的是,只有几个问题:[添加唯一的数组并保持字段计数更新](http://stackoverflow.com/q/36119850/5031275),尽管为了一个不同的目的,至少应该给你指向正确的方向。 –

+0

我认为它是一个好主意:)也许这就是为什么我无法找到信息如何做到这一点,就像我想要做的。 – Jogibaer

回答

0

workcenters文件是空的,如下

> db.workcenters.find() 
{ "_id" : ObjectId("56ef4f51fc6035db1abbf8ce"), "WorkCenters" : [ ] } 

您可以$ne如下

> db.workcenters.update({_id: ObjectId('56ef4f51fc6035db1abbf8ce'), 
         'WorkCenters.workCenter': {$ne: 'L4MSB010'}}, 
         {$addToSet: { 
          WorkCenters: { 
            workCenter: 'L4MSB010', 
            Issues: [{issueType: 'Tech Error', 
              issueDuration: 0}]}}}) 

结果通过$addToSet插入新workcenter

> db.workcenters.find() 
{ "_id" : ObjectId("56ef4f51fc6035db1abbf8ce"), "WorkCenters" : [ { "workCenter" : "L4MSB010", "Issues" : [ { "issueType" : "Tech Error", "issueDuration" : 0 } ] } ] } 

然后尝试新workcenter ADDD与$eq现有workcenter如下

> db.workcenters.update({_id: ObjectId('56ef4f51fc6035db1abbf8ce'), 
         'WorkCenters.workCenter': {$eq: 'L4MSB010'}}, 
         {$addToSet: { 
          'WorkCenters.$.Issues': { 
            issueType: 'Communication COA', 
            issueDuration: 0}}}) 

结果:

> db.workcenters.find() 
{ "_id" : ObjectId("56ef4f51fc6035db1abbf8ce"), "WorkCenters" : [ { "workCenter" : "L4MSB010", "Issues" : [ { "issueType" : "Tech Error", "issueDuration" : 0 }, { "issueType" : "Communication COA", "issueDuration" : 0 } ] } ] } 
+0

它的工作原理非常感谢。但回到第一条评论,我组织了我的文件,这不好吗?我不知道如何做到这一点。文件不会增长很多,在年底可能总共只有800份。这就像一对多......一台机器有许多WorkCenters有很多问题。我有第二份文件,我存储了问题宕机时间和其他事项的摘要。 – Jogibaer