MongoDB v3.4根据每条记录的数组值初始化新字段值

afdcj2ne  于 2023-01-25  发布在  Go
关注(0)|答案(1)|浏览(110)

我有一个具有以下结构的集合:

{
    "_id":NUUID(...),
    "MyArray": [{
        "Name": "...",
        "MyId": "..."
    },
    {...}]
},
{...}

我的任务是引入一个新的字段ArrayId,如果MyArray.Name是X,它必须包含MyId中的值,否则不包含任何值(空字符串)。
我尝试了以下方法:

db.getCollection('myCollection').aggregate([
    {$addFields: {"ArrayId": {$cond: {if: {$eq: ["$MyArray.Name", "X"]}, then: "$MyArray.MyId", else: ""}}}},
    {$out: "myCollection_backup"}
])

但是结果集合对于所有记录具有空的ArrayId。
你能帮忙找到错误吗?在mongo3.4中有更简单的方法吗?

6qftjkof

6qftjkof1#

也许是这样的:

db.collection.aggregate([
{
 $addFields: {
  "ArrayId": {
    "$reduce": {
      "input": "$MyArray",
      "initialValue": "",
      "in": {
        $concat: [
          "$$value",
          {
            "$cond": {
              if: {
                $eq: [
                  "$$this.Name",
                  "X"
                ]
              },
              then: "$$this.MyId",
              else: ""
            }
          }
        ]
      }
    }
  }
}
}
])

解释:
在MyArray. Name ="X"的情况下,使用$addFileds/$reduce to $concat将MyArray. MyId转换为新变量SArrayId
(这是在我们预期只有一个MyArray. Name = X的情况下,如果有超过1个MyArray. Name = X,预期会发生什么?)
Playground
以下是仅当发现第一个Name = X时的版本更新(如果有多个Name = X):
Playground2

相关问题