【问题标题】:MongoDB Join QueryMongoDB加入查询
【发布时间】:2021-01-04 02:19:29
【问题描述】:

我有以下文档结构的集合。

Collection-1:getallusers:

   db.getallusers.find().pretty()
    {
            "_id" : ObjectId("5ff0c73e5930dd43c05ac221"),
            "userRefID" : "07f426ff-506f-4e5e-afdb-2c7397edac61",
            "userName" : "EPS Purecloud Support",
            "divisionId" : "36852a81-ad7f-4c71-a1cd-7f431c05179f",
            "divisionName" : "",
            "emailId" : "eps@genesys.com",
            "__v" : 0
    }
    {
            "_id" : ObjectId("5ff0c73e5930dd43c05ac222"),
            "userRefID" : "c5ce06dc-6265-4d16-be18-f5fc5a918295",
            "userName" : "Generic",
            "divisionId" : "36852a81-ad7f-4c71-a1cd-7f431c05179f",
            "divisionName" : "",
            "emailId" : "integration-generic-a03293c0-945d-11ea-a64c-ebeb45b9d295@webhook.com",
            "__v" : 0
    }

Collection-2:getallusersroles:

 db.getallusersroles.find().pretty()
{
        "_id" : ObjectId("5ff0fb02b21b1d0760f3107b"),
        "userRefID" : "07f426ff-506f-4e5e-afdb-2c7397edac61",
        "skillRefId" : "c02dbb03-ed78-442a-a9cd-0f16c823646b",
        "queueName" : "CIM_test",
        "__v" : 0
}
{
        "_id" : ObjectId("5ff0fb02b21b1d0760f3107c"),
        "userRefID" : "07f426ff-506f-4e5e-afdb-2c7397edac61",
        "skillRefId" : "a626d99e-f5e9-47ab-a5d0-d493003c737f",
        "queueName" : "CLAIMS",
        "__v" : 0
}
{
        "_id" : ObjectId("5ff0fb02b21b1d0760f3107d"),
        "userRefID" : "07f426ff-506f-4e5e-afdb-2c7397edac61",
        "skillRefId" : "9b31524c-b574-4917-b470-8b86f430beaa",
        "queueName" : "CSS_AZ_IND_BILL_EN_1",
        "__v" : 0
}
{
        "_id" : ObjectId("5ff0fb03b21b1d0760f310b3"),
        "userRefID" : "c5ce06dc-6265-4d16-be18-f5fc5a918295",
        "skillRefId" : "f3bf0897-1b63-4a03-9f8f-5b18fc03401b",
        "queueName" : "Aflac",
        "__v" : 0
}
{
        "_id" : ObjectId("5ff0fb03b21b1d0760f310b4"),
        "userRefID" : "c5ce06dc-6265-4d16-be18-f5fc5a918295",
        "skillRefId" : "c02dbb03-ed78-442a-a9cd-0f16c823646b",
        "queueName" : "CIM_test",
        "__v" : 0
}

要求:

需要一个集合 3 - testalluser 如下格式: 在这两个集合中,我正在尝试使用“userRefID”加入。 对我来说,我需要像下面的结构一样添加“角色”,你能帮我吗?谢谢

{
        "_id" : ObjectId("5fdb245b848fbb32e86172c6"),
        "userRefID" : "07f426ff-506f-4e5e-afdb-2c7397edac61",
        "userName" : "EPS Purecloud Support",
        "divisionId" : "36852a81-ad7f-4c71-a1cd-7f431c05179f",
        "divisionName" : "",
        "emailId" : "eps@genesys.com",
       
         "roles":[{
                   "userRefID" : "07f426ff-506f-4e5e-afdb-2c7397edac61",
                   "skillRefId" : "c02dbb03-ed78-442a-a9cd-0f16c823646b",
                   "queueName" : "CIM_test"
                   },
                   {
                    "userRefID" : "07f426ff-506f-4e5e-afdb-2c7397edac61",
                    "skillRefId" : "a626d99e-f5e9-47ab-a5d0-d493003c737f",
                    "queueName" : "CLAIMS",
                     }
                     {
                      ** third**
                     }                    
         
        "__v" : 0
    }
    {
    ** Similarly for second user data
    }

以下逻辑正常工作:

 db.getallusers.aggregate([
  {
    "$lookup": {
      "from": "getallusersroles",
      "localField": "userRefID",
      "foreignField": "userRefID",
      "as": "role"
    }
  },
  
{ $merge: { into: "testalluser" } }

]).pretty()

我在这里动态创建 testalluser 集合,而不是通过 Mongoose 模型。

很少有查询:

1.每次执行此操作时,我都需要清空此集合中的所有文档并将新文档保存到其中。 (通常当我通过 Mongoose 模型创建集合时,我将使用 deleteMany({}) 通过引用该模型来清除数据,但我无法在此处执行此操作,因为我没有此集合的模型)

2.当我使用 Mongoose 时,是否必须为所有集合创建模型。请指正,谢谢。

在下面的 Nodejs(Mongoose) 代码中,我试图删除此集合的文档,然后需要执行此连接逻辑以将输出存储在此集合中 (testalluser)。稍后我需要查找并作为响应发送。

const express = require('express');
const router = express.Router();
const request = require('request');
const config = require('../config');
const fs = require('fs'); 
const getAllUsers = require ('../db/getAllUsersListmodel');
const getAllUsersRoles = require ('../db/getetUserRolesListModel');
var mongoose = require('mongoose');
mongoose.connect ('mongodb://localhost/testdb',{ useUnifiedTopology: true , useNewUrlParser: true });

 
router.get('/', (req, res) => {
    // token in session -> get user data and send it back to the Angular app
   
  getAllUsersRoles.deleteMany({},()=>{  

    getAllUsersRoles.find((err,getusers)=>{
      if(err){
      console.log(err)
      }
      else{ 
        res.send(getusers);
        console.log(getusers);
      }
   })  
    
  })
  });

  module.exports = router;

【问题讨论】:

  • "localField": "userId", "foreignField": "userId",改成"localField": "userRefID", "foreignField": "userRefID",

标签: node.js mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:

您可以使用$lookup 中的管道来获得所需的输出。

db.users.aggregate([
  {
    "$lookup": {
      "from": "roles",
      "let": {
        "users_userrefid": "$userRefID"
      },
      "pipeline": [
        {
          $match: {
            "$expr": {
              "$eq": [
                "$userRefID",
                "$$users_userrefid"
              ]
            }
          }
        },
        {
          "$project": {
            __v: 0,
            _id: 0
          }
        }
      ],
      "as": "roles"
    }
  }
])

这是一个解决方案 - https://mongoplayground.net/p/hXEavgJg_ek。如果您有任何问题,请告诉我。

【讨论】:

  • @Varman。感谢我的拼写检查问题,我现在更正了问题。目前我必须在 NodeJS 中使用 Mongoose 应用这个逻辑,但我面临一些问题,你们能帮我吗?
猜你喜欢
  • 1970-01-01
  • 2012-01-14
  • 2011-06-01
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
相关资源
最近更新 更多