0

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");
                    }

1 Answer 1

3

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;
})
Sign up to request clarification or add additional context in comments.

1 Comment

Nice approach (-:

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.