简体   繁体   English

MongoDb 在子文档上返回匹配结果和匹配结果

[英]MongoDb return both matched results and matched results on subdocument

Hello i am trying to get my database to return both matched and empty results on a sub-document.您好,我正在尝试让我的数据库在子文档上返回匹配结果和空结果。

I am joining two tables using aggregate and lookup, below is the code我正在使用聚合和查找加入两个表,下面是代码

db.collection.aggregate([
    {
        $addFields: {
            cut_off_date: { $toDate: "$shipment_cutoff_date" },
        },
    },
    {
        $lookup: {
            from: "updates",
            localField: "_id",
            foreignField: "shipment_id",
            as: "updates",
        },
    },
    {
        $match: {
            "updates.description": { $ne: "All updates completed" },
        },
    },
]);

Challenge is i am trying to get All rows where all updates have been completed as well as all empty updates.挑战是我正在尝试获取所有更新已完成的所有行以及所有空更新。 If i remove the match parameters i get all the results including where the updates have been completed and i am trying to avoid doing a foreach after getting all my results.如果我删除匹配参数,我会得到所有结果,包括更新完成的位置,并且我试图避免在获得所有结果后进行 foreach。

Here is a snippet of the result without the match这是不匹配的结果片段

{
    "_id": "609927e31233700004370cfb",
    "title": "Hello World",
    "createdAt": "2021-05-10T12:32:35.799Z",
    "updatedAt": "2021-05-10T15:58:59.149Z",
    "updates": []
},
{
    "_id": "60940ad73ced476b2d0b3626",
    "createdAt": "2021-05-06T15:27:19.814Z",
    "updatedAt": "2021-05-10T12:49:08.167Z",
    "updates": [
        {
            "_id": "60952c0ed31c6283f302eb23",
            "post_id": "60940ad73ced476b2d0b3626",
            "description": "This is an update description",
            "createdAt": "2021-05-07T12:01:18.815Z",
            "updatedAt": "2021-05-07T12:01:18.815Z",
        },
    ]
},
{
    "_id": "60940ad73ced476b2d0b3626",
    "createdAt": "2021-05-06T15:27:19.814Z",
    "updatedAt": "2021-05-10T12:49:08.167Z",
    "updates": [
        {
            "_id": "60952c0ed31c6283f302eb23",
            "post_id": "60940ad73ced476b2d0b3626",
            "description": "All updates completed",
            "createdAt": "2021-05-07T12:01:18.815Z",
            "updatedAt": "2021-05-07T12:01:18.815Z",
        },
    ]
}

Here is a snippet of what i will like to achieve after the match这是我希望在比赛结束后实现的一个片段

{
        "_id": "609927e31233700004370cfb",
        "title": "Hello World",
        "createdAt": "2021-05-10T12:32:35.799Z",
        "updatedAt": "2021-05-10T15:58:59.149Z",
        "updates": []
    },
    {
        "_id": "60940ad73ced476b2d0b3626",
        "createdAt": "2021-05-06T15:27:19.814Z",
        "updatedAt": "2021-05-10T12:49:08.167Z",
        "updates": [
            {
                "_id": "60952c0ed31c6283f302eb23",
                "post_id": "60940ad73ced476b2d0b3626",
                "description": "This is an update description",
                "createdAt": "2021-05-07T12:01:18.815Z",
                "updatedAt": "2021-05-07T12:01:18.815Z",
            },
        ]
    },
    

I am trying to get the results without the section where update description is not "All updates completed我试图在没有更新描述不是“所有更新已完成”的部分的情况下获得结果

Any help here please, MondoDb version is 4+请在这里提供任何帮助,MondoDb 版本是 4+

You can use $filter您可以使用$filter

  • $facet to categorize incoming doucment into two. $facet将传入的文档分为两类。 1. updates == empty array and 2. update != empty array 1.更新==空数组和2.更新!=空数组
  • $redact use to keep or eliminate the document based on the condition we give $redact用于根据我们给出的条件保留或删除文档
  • $concatArray to combined to both arrays which were produced after $facet $concatArray合并到$facet之后生成的 arrays
  • $unwind to deconstruct the array $unwind解构数组
  • $replaceRoot to make to root $replaceRoot设置为 root

He is the script他是剧本

db.collection.aggregate([
  {
    "$facet": {
      "emptyUpdates": [
        {
          "$match": {
            $expr: { $eq: [ "$updates", [] ] }
          }
        }
      ],
      "withoutUpdate": [
        {
          "$match": {
            $expr: { $ne: [ "$updates", [] ] }
          }
        },
        {
          "$redact": {
            "$cond": [
              {
                "$anyElementTrue": {
                  "$filter": {
                    "input": "$updates",
                    "cond": {
                      $eq: [ "$$this.description","All updates completed" ]
                    }
                  }
                }
              },
              "$$PRUNE",
              "$$KEEP",              
            ]
          }
        }
      ]
    }
  },
  {
    "$project": {
      combined: {
        "$concatArrays": ["$emptyUpdates", "$withoutUpdate" ]
      }
    }
  },
  { "$unwind": "$combined" },
  {
    "$replaceRoot": {"newRoot": "$combined" }
  }
])

Working Mongo playground工作Mongo游乐场

Let me know anything goes wrong让我知道有什么问题

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM