【问题标题】:Join two collections by matching value present inside array of object using MongoDB使用 MongoDB 通过匹配对象数组中存在的值来连接两个集合
【发布时间】:2020-06-24 19:38:33
【问题描述】:

我想使用 MongoDB 加入两个集合,但本地字段匹配键存在于数组中。我在下面解释我的两个文件。

用户:

{ "_id" : ObjectId("5ee8c77330e6a86c5e5ce69b"),
    "IsDeleted" : false,
    "Name" : "savitha",
    "Number" : "9848868000",
    "Email" : "savitha.k@edqart.com",
    "Password" : "savitha1",
    "RoleId" : ObjectId("5ee1d885de9b6a5ae2bae165"),
    "RoleName" : "KIOSK",
    "UserType" : "POS",
    "IsActive" : true,
    "SalesAgentName" : "",
    "salesAgentEmail" : "",
    "SalesAgentMobile" : "",
    "SalesAgentAlternateMobile" : "",
    "SalesAgentRole" : "",
    "MerchantID" : "",
    "MachineName" : "",
    "MachineBank" : "",
    "StoreDetails" : [ 
        {
            "StoreCode" : "DKAA",
            "Counter" : 3,
            "TerminalID" : "12345",
            "CounterName" : "Counter3"
        }
    ]
}

这是我的主要收藏,我想加入以下收藏。

商店信息:

{
  "_id" : ObjectId("5e447571f034c748ab11bd15"),
    "IsActive" : true,
    "IsDeleted" : false,
    "StoreCode" : "DKAA",
    "StoreName" : "Deeksha Group",
    "StoreDescription" : "Deeksha Store is a place where Parents can purchase all the school merchandise in one place at reasonable prices.",
    "StoreBranch" : "Bengaluru",
}

在这里,我需要按照 StoreDetails.StoreCode(users) = StoreCode(storeinfo) 加入这两个集合,然后我只想在 StoreDetails 中添加带有相应记录的 StoreName(from storeinfo)。我在下面解释我的查询。

db.getCollection('users').aggregate([
    {
        $match: {"_id" : ObjectId("5ee8c77330e6a86c5e5ce69b")}
    },
    {
        $addFields: {
            "StoreDetails": {
                $ifNull : [ "$StoreDetails", [ ] ] 
            }
        }
    },
    {
        $lookup: {
            "from": "storeinfo",
            "localField": "StoreDetails.StoreCode",
            "foreignField": "StoreCode",
            "as": "StoreDetails.StoreCode"
        }
    }
])

但是根据这个查询,我没有得到预期的输出。我的预期输出应该如下所示。

{ "_id" : ObjectId("5ee8c77330e6a86c5e5ce69b"),
    "IsDeleted" : false,
    "Name" : "savitha",
    "Number" : "9848868000",
    "Email" : "savitha.k@edqart.com",
    "Password" : "savitha1",
    "RoleId" : ObjectId("5ee1d885de9b6a5ae2bae165"),
    "RoleName" : "KIOSK",
    "UserType" : "POS",
    "IsActive" : true,
    "SalesAgentName" : "",
    "salesAgentEmail" : "",
    "SalesAgentMobile" : "",
    "SalesAgentAlternateMobile" : "",
    "SalesAgentRole" : "",
    "MerchantID" : "",
    "MachineName" : "",
    "MachineBank" : "",
    "StoreDetails" : [ 
        {
            "StoreCode" : "DKAA",
            "StoreName" : "Deeksha Group"
            "Counter" : 3,
            "TerminalID" : "12345",
            "CounterName" : "Counter3"
        }
    ]
}

在这里,我只需要根据 storecode 将商店名称添加到相应的对象中。但根据我的查询,我从storeinfo 获取所有字段值。任何机构都可以帮助我解决这个问题。

【问题讨论】:

标签: mongodb aggregate


【解决方案1】:

这里是完整的查询

db.users.aggregate([
  {
    $match: {
      "_id": ObjectId("5ee8c77330e6a86c5e5ce69b")
    }
  },
  {
    $addFields: {
      "StoreDetails": {
        $ifNull: [
          "$StoreDetails",
          []
        ]
      }
    }
  },
  {
    $unwind: "$StoreDetails"
  },
  {
    $lookup: {
      "from": "storeinfo",
      "localField": "StoreDetails.StoreCode",
      "foreignField": "StoreCode",
      "as": "StoreDetails.StoreCode"
    }
  },
  {
    $unwind: "$StoreDetails.StoreCode"
  },
  {
    $project: {
      "Email": 1,
      "IsActive": 1,
      "IsDeleted": 1,
      "MachineBank": 1,
      "MachineName": 1,
      "MerchantID": 1,
      "Name": 1,
      "Number": 1,
      "Password": 1,
      "RoleId": 1,
      "RoleName": 1,
      "SalesAgentAlternateMobile": 1,
      "SalesAgentMobile": 1,
      "SalesAgentName": 1,
      "SalesAgentRole": 1,
      "UserType": 1,
      "_id": 1,
      "salesAgentEmail": 1,
      "StoreDetails": {
        "StoreCode": "$StoreDetails.StoreCode.StoreCode",
        "Counter": 1,
        "CounterName": 1,
        "StoreName": "$StoreDetails.StoreCode.StoreName",
        "TerminalID": 1
      }
    }
  },
  {
    $group: {
      _id: "$_id",
      "Email": {
        $first: "$Email"
      },
      "IsActive": {
        $first: "$IsActive"
      },
      "IsDeleted": {
        $first: "$IsDeleted"
      },
      "MachineBank": {
        $first: "$MachineBank"
      },
      "MachineName": {
        $first: "$MachineName"
      },
      "MerchantID": {
        $first: "$MerchantID"
      },
      "Name": {
        $first: "$Name"
      },
      "Number": {
        $first: "$Number"
      },
      "Password": {
        $first: "$Password"
      },
      "RoleId": {
        $first: "$RoleId"
      },
      "RoleName": {
        $first: "$RoleName"
      },
      "SalesAgentAlternateMobile": {
        $first: "$SalesAgentAlternateMobile"
      },
      "SalesAgentMobile": {
        $first: "$SalesAgentMobile"
      },
      "SalesAgentName": {
        $first: "$SalesAgentName"
      },
      "SalesAgentRole": {
        $first: "$SalesAgentRole"
      },
      "UserType": {
        $first: "$UserType"
      },
      "salesAgentEmail": {
        $first: "$salesAgentEmail"
      },
      "StoreDetails": {
        $push: {
          StoreCode: "$StoreDetails.StoreCode",
          Counter: "$StoreDetails.Counter",
          CounterName: "$StoreDetails.CounterName",
          StoreName: "$StoreDetails.StoreName",
          TerminalID: "$StoreDetails.TerminalID"
        }
      }
    }
  }
])

您可以在此处查看完整的工作示例https://mongoplayground.net/p/6KqECy-o1U8

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    相关资源
    最近更新 更多