简体   繁体   中英

Manipulating MongoDB response NodeJS

I made a "little" query for mongodb to join two collections and retrieve data.

The game: insert 2 or 3 params on a URL

-include can be 0,1 or 2.

0 exclusive 1 inclusive 2 return all

-netcode: is a key to filter data -group: another optional keys, that works with the first param "include"

-My query works perfectly, returns in a way how much times a event happened in a certain group.

-The problem? I can't work with the result of mongo db, i need to parse it to JSON. I'm not so clever at JS, so i don't know where to put it. Since i work in corporation, some of the code was already done.

Well my output is this:

    {
      "events": [
        {
          "_id": {
            "group": "GFS-CAJEROS-INFINITUM-TELDAT-M1",
            "event": "SNMP DOWN"
          },
          "incidencias": 1
        },
{
      "_id": {
        "group": "GFS-CAJEROS-MPLS",
        "event": "Proactive Interface Input Utilisation"
      },
      "incidencias": 1209
    },
    {
      "_id": {
        "group": "GFS-CAJEROS-MPLS",
        "event": "Proactive Interface Output Utilisation"
      },
      "incidencias": 1209
    },
    {
      "_id": {
        "group": "GFS-CAJEROS-MPLS",
        "event": "Proactive Interface Availability"
      },
      "incidencias": 2199
    },
    {
      "_id": {
        "group": "GFS-SUCURSALES-HIBRIDAS",
        "event": "Proactive Interface Output Utilisation"
      },
      "incidencias": 10
    },

But i want it fused in a JSON format, like this: check the int value is next for the name of the event.

[

{

"group": "GFS-CAJEROS-MPLS",
"Proactive Interface Input Utilisation" :  "1209",
"Proactive Interface Output Utilisation" : "1209",
"Proactive Interface Availability" : "2199",


},

 {

"group": "GFS-SUCURSALES-HIBRIDAS",

"Proactive Interface Output Utilisation" : "10",


},

I'm using Nodejs and the mongodb module, since i dont know how this function exactly works, i don't know how to manage the response, ¿there is a better way to do this? like to get the json file, using another js to generate it?

This is the code i'm using, basically is the important part:

var events = db.collection('events');

 events.aggregate([

   { $match : { netcode : data.params.netcode } },

    {
      $lookup:
        {
          from: "nodes",
          localField: "name",
          foreignField: "name",
          as: "event_joined"


        }

   },


  { $unwind:  {path: "$event_joined"} },

   { $match : {"event_joined.group" : 

   {$in: 

    [ 
    groups[0] ,
    groups[1] , 
    groups[2] , 
    groups[3] , 
    groups[4] , 
    groups[5] , 
    groups[6] ,
    groups[7] ,
    groups[8] ,
    groups[9] ,
    ] 

   }
}

},










  { $group : { _id : {group:"$event_joined.group", event:"$event"}, incidencias: { $sum: 1} } },





])

                .toArray( function(err, result) {
                    if (err) {
                        console.log(err);

                    } else if (result) {

                        data.response.events = result;


                    } else {
                        console.log("No result");
                    }

You should add another $group to your pipeline {_id: "$_id.group", events: {$push : {name: "$_id.event", incidencias: "$incidencias"}}}

Then change the structure of your data on the JS code with "Array.map".

data.response.events = data.response.events.map(function (eve){
 var obj = {
    "group": eve.group
 };
 eve.events.forEach(function (e){
   obj[e.name] = e.incidencias
 })

 return obj;
})

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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