繁体   English   中英

MongoDB 深度嵌套数组的更新值和排序

[英]MongoDB update value of deeply nested array and sort

我有这个按时间排序的时间戳文档:

{
  _id: '1',
  timestamps: [
    {
      id: '589b32cf-28b3-4a25-8fd1-5e4f86682199',
      time: '2022-04-13T19:00:00.122Z'
    },
    {
      id: '781a47de-d21a-4c2c-9814-b46f4a3cfa30',
      time: '2022-04-13T20:00:00.498Z'
    }
  ]
};

我想通过id更新一个时间戳,更改时间,排序

示例:使用id: '589b32cf-28b3-4a25-8fd1-5e4f86682199'

{
  id: '589b32cf-28b3-4a25-8fd1-5e4f86682199',
  time: '2022-04-13T20:30:00.122Z'
}

更新后的文件应该是这样的:

{
  _id: '1',
  timestamps: [
    {
      id: '32bb3-2222-1111-j878-b4000a3wwa30',
      time: '2022-04-13T19:30:00.122Z'
    },
    {
      id: '589b32cf-28b3-4a25-8fd1-5e4f86682199',
      time: '2022-04-13T20:30:00.122Z'
    }
  ]
};

我想出了这个方法来更新和排序数组中的每个元素:

const updateResult = await TimestampCollection.updateOne(
  { _id: '1' },
  {
    $push: {
      timestamps: {
        $each: [{ id: timestamp.id, time: timestamp.time }],
        $sort: { time: 1 }
      }
    }
  }
);

然而,这将一个新的 object 推送到具有相同 ID 和更新时间的数组:

{
  _id: '1',
  timestamps: [
    {
      id: '589b32cf-28b3-4a25-8fd1-5e4f86682199',
      time: '2022-04-13T19:00:00.122Z'
    },
    {
      id: '32bb3-2222-1111-j878-b4000a3wwa30',
      time: '2022-04-13T19:30:00.122Z'
    },
    {
      id: '589b32cf-28b3-4a25-8fd1-5e4f86682199',
      time: '2022-04-13T20:30:00.122Z'
    }
  ]
};

知道如何解决这个问题吗?

我没有找到在单个查询中执行此操作的方法。 遗憾的是,在单个查询中组合$set$push会导致冲突...

db.collection.update({
  _id: "1",
  "timestamps.id": timestamp.id
},
{
  "$set": {
    "timestamps.$.time": timestamp.time
  },
});

db.collection.update({
  _id: "1",
},
{
  "$push": {
    "timestamps": {
      "$each": [],
      "$sort": {
        "time": 1
      }
    }
  }
})

此解决方案涉及两个查询。 一个用于更新数组中的元素,另一个用于对数组进行排序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM