【问题标题】:What would be the best practice to perform actions on document that have list of docs that have list of docs?对具有文档列表的文档执行操作的最佳实践是什么?
【发布时间】:2018-07-29 20:41:30
【问题描述】:

我有一个如下所示的用户文档:

{
  "userId": "249869823570",
  "name": "john",
  "country": "usa",
  "active": true,
  "serviceProviders": [
    {
      "serviceProvidersId": "897892893",
      "serviceProvidersName": "AT&T",
      "active": true,
      "serviceProviderContactPerson": []
    },
    {
      "serviceProvidersId": "82589628569",
      "serviceProvidersName": "T-Mobile",
      "active": true,
      "serviceProviderContactPerson": []
    }
  ]
}

我想创建 3 个方法来插入/更新/删除 serviceProviderContactPerson。我的困境是,我的主文档有一系列 serviceProviders,而 serviceProvider 有一个 serviceProviderContactPerson 列表......在 mongo 中工作的最佳实践是什么?

serviceProviderContactPerson 文档将如下所示:

{
    "contactId": "873498798",
    "name": "Mark",
    "email": "mark@tmobile.com",
    "phone": "917-475-4637"
}

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    您可以使用 update 来执行 3.6 中的所有操作。

    在 serviceProvidersId = "897892893" 的地方插入一个新的数组元素

    db.colname.update(
      {"serviceProviders.serviceProvidersId":"897892893"},
      {$push: {"serviceProviders.$.serviceProviderContactPerson":serviceProviderContactPersonDoc}}
    )
    

    更新 serviceProvidersId = "897892893" 和 contactId = "873498798" 的电话

    db.colname.update(
      {},
      {$set: {"serviceProviders.$[sp].serviceProviderContactPerson.$[spc].phone":phone value}},
      {arrayFilters:[{"sp.serviceProvidersId":"897892893"}, {"spc.contactId":"873498798"}]}
    )
    

    删除 serviceProvidersId = "897892893" 和 contactId = "873498798" 的数组元素

    db.colname.update(
          {},
          {$pull: {"serviceProviders.$[sp].serviceProviderContactPerson":{"contactId":"873498798"}}},
          {arrayFilters:[{"sp.serviceProvidersId":"897892893"}]}
        )
    

    【讨论】:

    • 我试图使用类似这样的方法进行 findAndModify:val query = json("userId"-> "249869823570", "serviceProviders. serviceProvidersId" -> "897892893", "serviceProviders. serviceProvidersId.contactId" -> "873498798") val update = json("$set" -> json("serviceProviders.$. serviceProviderContactPerson.$" -> contact))
    • 3.6以下版本不允许使用多个位置运算符。
    • 那么我怎样才能使用 findAndModify 来完成呢?因为这就是我迄今为止的工作方式
    • 你的版本是什么?
    • 3.4,无法升级
    猜你喜欢
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    相关资源
    最近更新 更多