如何對同一個數組元素進行兩次操作?

加布里埃爾·盧普

我有users(簡化的)文檔結構的MongoDB集合:

{
  _id: ObjectId,
  name: 'John Doe',
  sportsList: [ // array of objects
    {
      name: 'football',
      level: 1500,
      levelHistory: [ // array of objects
        {
          from: 1450,
          to: 1500,
          date: Date
        },
        ...
      ]
    },
    {
      name: 'tennis',
      level: 1400,
      levelHistory: [ // array of objects
        {
          from: 1350,
          to: 1400,
          date: Date
        },
        ...
      ]
    },
  ]
}

我想更新sportsList具有name === 'tennis'這樣的元素

  • 推入一個新元素 levelHistory
  • 更新level到目前為止,我已經設法levelHistory使用此查詢推送一個新元素
await User.updateOne(
  {
    _id: userId,
    sportsList: {
      $elemMatch: { name: 'tennis' }
    }
  },
  {
    $push: {
      'sportsList.$.levelHistory': {
        date: Date,
        from: 1400,
        to: 1450
      }
    },
    // how do I set 'level: 1450' in the same query?
    // if I tried to use a $set: { 'sportsList.$.level': 1450 } mongoDB throws an error
  }
)
塔基斯_

詢問

  • 管道更新需要 MongoDB >= 4.2
  • 在數組上映射
  • 如果名稱不是網球,則不要更改元素
  • 否則將元素(嵌入式文檔)與具有新級別的文檔和新級別歷史(舊元素的連接,與新元素)合併

測試代碼在這裡

update(
{"_id": 1},
[{"$set": 
   {"sportsList": 
     {"$map": 
       {"input": "$sportsList",
        "in": 
        {"$cond": 
          [{"$ne": ["$$this.name", "tennis"]}, "$$this",
           {"$mergeObjects": 
           ["$$this",
            {"level": 1450,
             "levelHistory": 
                {"$concatArrays": 
                  ["$$this.levelHistory",
                  [{"from": 1400, "to": 1450, "date": 4}]]}}]}]}}}}}])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用單個數組對兩個或多個數組進行排序?

同時對兩個數組進行排序

如何使用兩個參數對元組進行排序?

將兩個數組列表與相同類型的對象進行比較。如何獲取第一個列表中除第二個列表中包含的元素之外的所有元素?

如何根據javascript中的第一個元素對多個嵌套數組的第二個元素進行分組?

如何對兩個單獨數組的兩個值執行函數

按另一個對像數組對對像數組進行排序

使用月對兩個對像數組進行聚類

如何在兩個對像數組之間進行更改?[洛達什/JS]

如何使用 Array.prototype.sort() 按兩個屬性對數組進行排序?

有沒有更好的方法根據 2 個不同的標準對 2D 數組進行兩次排序?

如何在按另一個鍵排序之前按鍵對 PHP 數組進行分組?

如何在python中提取兩個數組的對應元素

將兩個數組 List 合併在一起並對其進行排序,刪除過程中的零

如何按多個日期字段對對像數組進行排序?

如何將具有兩個屬性的對像數組減少為兩個數組,每個屬性一個?

按第一個字母對數組進行分組 - 使用 groupBy 方法 (Lodash)

如何在不使用排序方法(排序)或排序算法(冒泡排序、快速排序)的情況下對兩個已排序數組進行排序

根據最佳匹配另一個數組對對像數組進行排序

如何對 mongodb 進行兩次調用以獲取數據並將其傳遞給子組件?

如何通過在包含與字段匹配的數組的對象的數組上運行一次來創建 2 個數組?

如何按年份對日期數組進行分組並減去最後一個值 - 第一個值?

使用 xsl group-starting-buy 對兩個節點之間的元素進行分組

使用相同的列索引對指定數組的列進行操作 - 數組中的前一行

將兩個對應的數組元素相加並返回結果數組

PHP中根據兩個條件對多個關聯數組進行分組和排序

你如何通過一個參數對數組列表中的對象進行排序,然後如果該參數與 Java 中另一個參數的順序相同?

如何對帖子對像數組進行排序?

計算兩個唯一值在同一組中無序出現的次數