【问题标题】:Mongodb Schema issueMongodb 架构问题
【发布时间】:2020-12-16 14:44:52
【问题描述】:

在这里,我使用 Nodejs 应用程序从外部 API 获取 JSON 响应。我需要捕获此响应的几个键值对并需要将其保存到 MongoDB。 我得到了正确的响应,但我无法将数据保存在数据库中。

要求:

每次我从外部服务器收到此响应时,如果此集合中已存在任何文档,我需要通过重写任何文档将其保存在表中。这里我在 json 响应中有近 7 个数组项,我需要从所有项中自动保存对应的键值对。

型号:

    var mongoose = require('mongoose');
    const getAllUsersDataSchema = new mongoose.Schema({
        userRefID:[] ,
        userName:[],
        divisionId: [{}],
        divisionName:[{}],
        emailId :[{}],
    })
    module.exports = getAllUsers = mongoose.model('getAllUsers',getAllUsersDataSchema );

**API Call where i am capturing external  API response:**

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');
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
   
    var data =fs.readFileSync('../teamlist.txt',  {encoding:'utf8'} )
    console.log(data);

    if (data) {
      request(
        {
          method: 'GET',
         
          url: 'https://api.mypurecloud.com/api/v2/users',

          headers: {
            'Authorization': 'Bearer ' + data
          }
        },
  
        // callback
        (error, response, body) => {

          let userInfoResponse = JSON.parse(body);
          res.send(userInfoResponse);
          console.log(userInfoResponse.entities.length)
          console.log(userInfoResponse.entities[0].division.id)

          getAllUsers.create({
            userRefID : userInfoResponse.entities.id,
            userName: userInfoResponse.entities.name,
            divisionId: userInfoResponse.entities.division.id,
            divisionName:userInfoResponse.entities.division.name,
           emailId:userInfoResponse.entities.primaryContactInfo.address      
        }, (error,post)=>{
            console.log(error,post);
        });
}
          );
        }

// no token -> send nothing
    else {
      res.send("Token Not Present - Kindly login in back");
    }

    //console.log(req.session.token);
       
  });

数据正在保存在 DB 中,但没有将任何数组数据保存到其中。

{
        "_id" : ObjectId("5fd998d61439a434983702cd"),
        "userRefID" : [ ],
        "userName" : [ ],
        "__v" : 0
}

这是准确的 API JSON 响应,我正在尝试将其保存在数据库中并用于将来参考:

{
  "entities": [
    {
      "id": "07f426ff-506f-4e5e-afdb-2c7397edac61",
      "name": "EPS Purecloud Support",
      "division": {
        "id": "36852a81-ad7f-4c71-a1cd-7f431c05179f",
        "name": "",
        "selfUri": "/api/v2/authorization/divisions/36852a81-ad7f-4c71-a1cd-7f431c05179f"
      },
      "chat": {
        "jabberId": "5dcc25e1db8c7e19238a287d@cognizant3.orgspan.com"
      },
      "email": "eps@genesys.com",
      "primaryContactInfo": [
        {
          "address": "eps@genesys.com",
          "mediaType": "EMAIL",
          "type": "PRIMARY"
        }
      ],
      "addresses": [],
      "state": "active",
      "username": "eps@genesys.com",
      "version": 3,
      "acdAutoAnswer": false,
      "selfUri": "/api/v2/users/07f426ff-506f-4e5e-afdb-2c7397edac61"
    },
    {
      "id": "c5ce06dc-6265-4d16-be18-f5fc5a918295",
      "name": "Generic",
      "division": {
        "id": "36852a81-ad7f-4c71-a1cd-7f431c05179f",
        "name": "",
        "selfUri": "/api/v2/authorization/divisions/36852a81-ad7f-4c71-a1cd-7f431c05179f"
      },
      "chat": {
        "jabberId": "5ebab3dba6686314f6913b98@cognizant3.orgspan.com"
      },
      "email": "integration-generic-a03293c0-945d-11ea-a64c-ebeb45b9d295@webhook.com",
      "primaryContactInfo": [
        {
          "address": "integration-generic-a03293c0-945d-11ea-a64c-ebeb45b9d295@webhook.com",
          "mediaType": "EMAIL",
          "type": "PRIMARY"
        }
      ],
      "addresses": [],
      "state": "active",
      "username": "integration-generic-a03293c0-945d-11ea-a64c-ebeb45b9d295@webhook.com",
      "version": 2,
      "acdAutoAnswer": false,
      "selfUri": "/api/v2/users/c5ce06dc-6265-4d16-be18-f5fc5a918295"
    },
  {
   /**  3rd User *********/
  }
{
   /**  4th User *********/
  }

],
  "pageSize": 25,
  "pageNumber": 1,
  "total": 7,
  "firstUri": "/api/v2/users?pageSize=25&pageNumber=1",
  "selfUri": "/api/v2/users?pageSize=25&pageNumber=1",
  "lastUri": "/api/v2/users?pageSize=25&pageNumber=1",
  "pageCount": 1
}

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    Entities 是一个对象数组,但您试图将其属性称为对象:

    userRefID : userInfoResponse.entities.id, // but "entities": [ {"id":"...", "name":"..."} ],
    userName: userInfoResponse.entities.name,
    

    您必须循环收集数据,然后才将其插入数据库:

    const usersArray = userInfoResponse.entities.map(el => ({
      userRefID : el.id,
      userName: el.name,
      divisionId: el.division.id,
      divisionName: el.division.name,
      emailId: el.primaryContactInfo[0].address
    }));
    
    getAllUsers.insertMany(usersArray)
    

    【讨论】:

    • 非常感谢尤里。我对此没有更多的担忧。 a.每当我得到响应时,我都需要用这个新数据重写集合中已经存在的旧数据。 b.我是否有选项将此数据放在数据库内的数组下。像这样,userData:[ {“userRefID”:“337984b2-cf2f-49c8-84e9-3c2bc7b1f197”,“userName”:“TestUser”,“divisionId”: “36852a81-ad7f-4c71-a1cd-7f431c05179f”,“emailId”:“testuser@cognizant.com”},{第二个数据}]
    • @hari 如果需要覆盖数据,先删除所有旧数据:await getAllUsers .deleteMany();
    • @hari 关于第二个问题:将 .update() 与 $push 一起使用:docs.mongodb.com/manual/reference/operator/update/push
    猜你喜欢
    • 1970-01-01
    • 2011-11-20
    • 2015-08-29
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 2011-02-14
    • 2012-11-25
    • 2018-05-26
    相关资源
    最近更新 更多