mongodb:推送到数组元素的子数组或添加到数组(如果不存在)

时间:2016-04-08 08:27:15

标签: mongodb

考虑具有以下结构的文档的集合webs

[
  {
    "_id": ObjectId("5631e7f6cc6b441000ad9033"),
    "name": "web1",
    "pagehits": [
      {
        "ip": "12.34.56.78",
        "hits": [
          ISODate("2015-10-28T11:06:37.536+0000"),
          ISODate("2015-11-28T11:06:37.536+0000")
        ]
      }
    ]
  }
]

网络(当然)有_idname,(其他未提及的属性)和pagehits数组。每个数组项对应一个ip。此外,每个网页匹配都会在hits项的pagehit子数组中保存为日期。

add pagehit函数的伪算法因此看起来像

  • find网址已提供ObjectId
  • 是否已存在当前用户ip的数组项?
    • :将当前日期追加到已存在的pagehits数组元素
    • :将新项目附加到pagehits数组,其中ip为当前用户ip,hits为仅包含当前日期的数组。

是否可以通过单个MongoDB调用(insert hit)实现此findOneAndUpdate函数?

保证所有网站都存在,因此无需在集合中插入整个文档。

可能发生的两种情况的例子:

案例1)点击IP 192.168.0.1 (尚未列入清单):添加了新的子文档

[
  {
    "_id": ObjectId("5631e7f6cc6b441000ad9033"),
    "name": "web1",
    "pagehits": [
      {
        "ip": "12.34.56.78",
        "hits": [
          ISODate("2015-10-28T11:06:37.536+0000"),
          ISODate("2015-11-28T11:06:37.536+0000")
        ]
      },
      {
        "ip": "192.168.0.1",
        "hits": [
          ISODate("2016-04-08T11:25:37.536+0000")
        ]
      }
    ]
  }
]

案例2)点击IP 12.34.56.78 (已在列表中):当前日期被推送到点击数组

[
  {
    "_id": ObjectId("5631e7f6cc6b441000ad9033"),
    "name": "web1",
    "pagehits": [
      {
        "ip": "12.34.56.78",
        "hits": [
          ISODate("2015-10-28T11:06:37.536+0000"),
          ISODate("2015-11-28T11:06:37.536+0000"),
          ISODate("2016-04-08T11:25:37.536+0000")
        ]
      }
    ]
  }
]

0 个答案:

没有答案