【问题标题】:MongoDB push existing field value to another field in an array of objectsMongoDB 将现有字段值推送到对象数组中的另一个字段
【发布时间】:2022-01-03 04:43:07
【问题描述】:

如果我有这样的文件:

db.people.insertOne({name: "Annie", latestScore: 5});

然后基于this answer,我可以将latestScore 移动到这样的数组字段:

db.people.updateOne(
    {name: 'Annie'},
    [
        {$set: 
            {scoreHistory: 
                {$concatArrays: [
                    {$ifNull: ["$scoreHistory", []]},
                    ["$latestScore"]
                ]}
            }
        }, 
        { $unset: ["latestScore"] }
    ]
);

这是生成的文档:

{
  _id: ObjectId("61d2737611e48e0d0c30b35b"),
  name: 'Annie',
  scoreHistory: [ 5 ]
}

我们可以对嵌套在数组中的对象执行相同的更新吗?例如,如果文档是这样的:

db.people.insertOne({
    name: 'Annie',
    words: [
        {word: "bunny", score: 5},
        {word: "pink", score: 5}
    ]
});

我们如何将其更新为:

{
    name: 'Annie',
    words: [
        {word: "bunny", scoreHistory: [5]},
        {word: "pink", scoreHistory: [5]}
    ]
}

我知道我可以从应用程序迭代和修改数组并立即更新整个数组,但我想使用上面第一个示例中的运算符来完成。

网站首先在行中显示words.wordwords.score,单击一行会在弹出窗口中显示words.scoreHistory。我希望单词数组小于 500。也欢迎任何关于重塑架构以简化上述操作的建议!

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:
    db.collection.update({
      name: "Annie"
    },
    [
      {
        $set: {
          words: {
            $map: {
              input: "$words",
              as: "m",
              in: {
                word: "$$m.word",
                scoreHistory: {
                  $concatArrays: [
                    {
                      $ifNull: [
                        "$$m.scoreHistory",
                        []
                      ]
                    },
                    [
                      "$$m.score"
                    ]
                  ]
                }
              }
            }
          }
        }
      }
    ])
    

    mongoplayground

    【讨论】:

    • 此查询会覆盖每次更新的历史记录;需要进行修改以通过保留值来使scoreHistory 字段实际上表现得像历史记录 - mongoplayground - preserve history。由于编辑队列已满,因此不允许我将此建议为编辑。
    • @AndrewNessin 我用你的建议更新我的答案
    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 2020-07-29
    • 1970-01-01
    • 2020-04-28
    • 2019-10-13
    • 2015-04-23
    • 2020-07-24
    • 1970-01-01
    相关资源
    最近更新 更多