从嵌套数组内部移动数据

时间:2019-05-21 11:53:08

标签: mongodb

我在Mongo数据库中错误地插入了多个文档。我不小心将数据嵌套在另一个数据对象中:

{
  "_id": "5cdfda8ddc5cf00031fd3949",
  "payload": {
    "timestamp": "2019-05-18T10:12:29.896Z",
    "data": {
      "data": {
        "name": 10,
        "age": 10,
      }
    }
  },
  "__v": 0
}

我希望文档中没有多余的数据对象。所以我希望它看起来像这样:

{
  "_id": "5cdfda8ddc5cf00031fd3949",
  "payload": {
    "timestamp": "2019-05-18T10:12:29.896Z",
    "data": {
      "name": 10,
      "age": 10,

    }
  },
  "__v": 0
}

在Mongo中,我是否可以将所有具有2个数据对象的文档更新为仅具有上面所示的文档?

2 个答案:

答案 0 :(得分:0)

A,您不能使用一个数据库请求来执行此操作。您必须以编程方式遍历所有文档,设置新数据并在数据库中更新它们。

答案 1 :(得分:0)

您可以使用aggregation framework,它不会让您到位进行更新,但是如果可以的话,您可以使用$out operator将结果写到新集合中。

db.collection.aggregate([
  {
    $project: {
      __v : 1,
      "payload.timestamp" : 1,
      "payload.data" : "$payload.data.data"
    },
  },
  {
    "$out": "newCollection"
  }
])

或者,如果您混合使用格式正确的文档和格式错误的文档,则可以使用$cond operator确定正确的输出:

db.collection.aggregate([
  {
    $project: {
      __v : 1,
      "payload.timestamp" : 1,
      "payload.data" : {
        $cond: [
          { $ne : [ "$payload.data.data", undefined]},
          "$payload.data.data",
          "$payload.data"
        ]} 
    }
  },
  {
    "$out": "newCollection"
  }
])