带条件的对象的mongo数组更新

时间:2019-08-21 08:07:16

标签: mongodb mongodb-query aggregation-framework apache-nifi

我有一个包含一些文档的集合,每个文档都有一个对象列表,这些对象表示带有关键字的时期的时间间隔。我想更新右文档中每个对象的间隔的最终值,其中结束值大于某个值。如果什么都无法更新,我想插入一个新间隔,将开始和结束作为新值,并使用查询中使用的关键字。

我正在使用nifi执行此任务和更新块,同时启用了upsert。我也可以使用聚合,但是应该可以通过upsert进行聚合。

这就是我现在所拥有的

QUERY
{
    "_id":"docid",
    "thearray.keyword": "red",
    "thearray.end": {$gte :minUpdatable}
}

,并将其作为更新正文:

UPDATE BODY
{
      "thearray.$[].end": valueToUpdate,
      "$setOnInsert":{"$push": {"thearray":{"keyword":"red","start":valueToUpdate,"end":valueToUpdate}}}
    }
}

这是文档数据结构: 初始状态

{
  _id:"docid",
  otherInfo:"",
  thearray:[
    {keyword:"red",start:8,end:15},
    {keyword:"blue",start:8,end:15},
    {keyword:"red",start:8,end:9},
    {keyword:"red",start:9,end:16},
    ...
  ]
}

示例1:在这种情况下,应从初始状态开始,以“ docid”作为文档,以“ red”作为关键字,以12作为可更新的最低最终值(minUpdatable),以22作为设置文档的值进行更新变成类似

{
  _id:"docid",
  otherInfo:"",
  thearray:[
    {keyword:"red",start:8,end:22},
    {keyword:"blue",start:8,end:15},
    {keyword:"red",start:8,end:9},
    {keyword:"red",start:9,end:22},
    ...
  ]
}

示例2:在相同情况下,从初始状态开始,应以“ docid”作为文档,以“ red”作为关键字,以33为可能更新的下限值,以39作为设置文档的值进行更新诸如此类的内容(或导致无法更新的任何查询):

{
  _id:"docid",
  otherInfo:"",
  thearray:[
    {keyword:"red",start:8,end:15},
    {keyword:"blue",start:8,end:15},
    {keyword:"red",start:8,end:9},
    {keyword:"red",start:9,end:16},
    ...,
    {keyword:"red",start:33,end:33}
  ]
}

0 个答案:

没有答案