【问题标题】:mongodb upsert / addToSet / embedded Documentsmongodb upsert / addToSet / 嵌入文档
【发布时间】:2016-03-21 01:17:59
【问题描述】:

我的文档应该是这样的,一个 id 最多有 20 个工作中心,每个工作中心可能有一些问题。一旦 id 前进到下一个工作中心,每个工作中心数组就会关闭或阻止进一步输入。

{
  _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
      }
    }
  ]
}

但同一工作中心的第二个条目是对第一个条目的完整添加,而不仅仅是问题类型和时间。 并且一个新的 workCenter 不会添加一个新的数组。

   {
  _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
      }
    }
  ]
}

我希望它对我想要完成的事情半途而废。 任何帮助或提示都非常感谢。 谢谢

【问题讨论】:

  • 其实它不是你想要的。请注意,"Issues" 包含一个“对象”{},而不是数组[]。仅此一项就应该向您突出问题。有趣的是,这里只是几个问题:Add Unique only to array and keep field count on update,虽然出于不同的目的,但至少应该为您指明正确的方向。
  • 我认为这是个好主意 :) 也许这就是为什么我找不到信息如何像我想做的那样去做。

标签: mongodb meteor mongodb-query


【解决方案1】:

workcenters 文档为空时如下所示

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

您可以插入新的workcenter$addToSet$ne,如下所示

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

结果是

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

然后尝试将新的workcenter 添加到现有的workcenter$eq 如下

> 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 } ] } ] }

【讨论】:

  • 成功了,非常感谢。但是回到第一个评论,我组织文件的那种,是不是很糟糕?我不知道该怎么做。文件不会增长很多,到年底可能总共只有800个。就像一对多……一台机器有很多工作中心有很多问题。我还有第二份文档,用于存储问题停机时间和其他内容的摘要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 2016-11-11
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多