在MongoDB中推送项目之前过滤数组

s3fp2yjn  于 2023-03-01  发布在  Go
关注(0)|答案(1)|浏览(100)

我在mongo中有一个名为“activities”的集合,每个activity都有一个users字段,它是一个对象数组,包含userId和一个scores对象。我只想将列表中不存在于users数组中且具有默认scores值的用户添加到users字段,因此我将不覆盖现有用户的scores
假设该练习具有以下users数组:

[{ userId: 1, scores: { failures: 2, wins: 4 } }, 
 { userId: 2, scores: { failures: 0, wins: 2 } }]

userIds数组为[2,3],默认分数为{ failures: 0, wins: 0 },则结果应为

[{ userId: 1, scores: { failures: 2, wins: 4 } }, 
 { userId: 2, scores: { failures: 0, wins: 2 } }, 
 { userId: 3, scores: { failures: 0, wins: 0 } }]

只有userId 3应添加为默认值scores,因为userId 2已存在。

lokaqttq

lokaqttq1#

使用流水线更新和$reduce,

db.collection.update({},
[
  {
    $set: {
      "users": {
        $reduce: {
          input: [2,3],                             //1. your input
          initialValue: "$users",                   //2. start with existing users array field
          in: {
            $cond: [
              {
                $in: ["$$this","$$value.userId"]    //3. if each input exists in users array
              },
              {
                $concatArrays: ["$$value"]          //4. retain existing users array
              },
              {
                $concatArrays: [                    //5. if not, concatenate new element to array
                  "$$value",
                  [
                    {
                      userId: "$$this",
                      scores: {
                        failures: 0,
                        wins: 0
                      }
                    }
                  ]
                ]
              }
            ]
          }
        }
      }
    }
  }
],
{
  multi: true
})

Demo

相关问题