簡體   English   中英

MongoDB 聚合添加具有多個條件的新字段

[英]MongoDB aggregate add new field with multiple conditions

我無法在 MongoDB 中添加具有多個條件的新字段。 這是 DB 的樣子,

const db = [
  {
    _id: 1,
    isActived: false, // Drafted
    isScheduled: false,
    isExpired: false
  },
  {
    _id: 2,
    isActived: true, 
    isScheduled: true, // Scheduled
    isExpired: false
  },
  {
    _id: 3,
    isActived: true, // Expired
    isScheduled: false,
    isExpired: true
  },
  {
    _id: 4,
    isActived: true, // Actived
    isScheduled: false,
    isExpired: false
  },
]

條件是:

if (!isActived) status = "Draft"
if (isActived && isScheduled) status = "Scheduled"
if (isActived && isExpired) status = "Expired"
if (isActived && !isScheduled && !isExpired) status = "Actived"

我只能找出一個條件,無法進一步解決。 這是我到目前為止所做的

{
      $addFields: {
        status: {
          $cond: [
            {
              $and: [
                { $eq: ["$isActived", true] },
                { $eq: ["$isScheduled", true] },
              ],
            },
            "Actived",
            "Scheduled",
          ],
          $cond: [
            {
              $and: [
                { $eq: ["$isActived", true] },
                { $eq: ["$isExpired", true] },
              ],
            },
            "Actived",
            "Expired",
          ],
        },
      },
    }

結果不是我所期望的。 任何建議。 謝謝你。

您可以通過這種方式連接if/else

偽代碼:

if !isActived:
  return "Draft"
else
  if !isScheduled && !isExpired:
    return "Actived"
  else
    if isScheduled:
      return "Scheduled"
    else
      return "Expired" //<-- Since one of "isScheduled" and "isExpired" should be true

注意最后一行,你可以將isScheduledisExpired為 true,這樣你的邏輯就可以改變。

db.collection.aggregate([
  {
    "$set": {
      "status": {
        "$cond": {
          "if": {
            "$eq": [
              "$isActived",
              false
            ]
          },
          "then": "Draft",
          "else": {
            "$cond": {
              "if": {
                "$and": [
                  {
                    "$eq": [
                      "$isExpired",
                      false
                    ]
                  },
                  {
                    "$eq": [
                      "$isScheduled",
                      false
                    ]
                  }
                ]
              },
              "then": "Actived",
              "else": {
                "$cond": {
                  "if": {
                    "$eq": [
                      "$isScheduled",
                      true
                    ]
                  },
                  "then": "Scheduled",
                  "else": "Expired"
                }
              }
            }
          }
        }
      }
    }
  }
])

這里的例子

簡單的嵌套條件,工作解決方案

db.collection.aggregate([
    {
        $addFields: {
        status: {
            $cond: [
            {
                $and: [
                { $eq: [ "$isActived", true ] },
                { $eq: [ "$isScheduled", false ] },
                { $eq: [ "$isExpired", false ] },
                ],
            },
            "Actived",
            {
                $cond: [
                {
                    $and: [
                    { $eq: [ "$isActived", true ] },
                    { $eq: [ "$isExpired", true ] },
                    ],
                },
                "Expired",
                {
                    $cond: [
                    {
                        $and: [
                        { $eq: [ "$isActived", true ] },
                        { $eq: [ "$isScheduled", true ] },
                        ],
                    },
                    "Scheduled",
                    {
                        $cond: [
                        {
                            $and: [
                            { $eq: [ "$isActived", false ] },                          
                            ],
                        },
                        "Draft",
                        null,
                        ],
                    },
                    ],
                },
                ],
            },
            ],
        },
        },
    },
])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM