Home > Enterprise >  How to rearrange my output to be a single object and be separated by a comma ? Mongodb/python
How to rearrange my output to be a single object and be separated by a comma ? Mongodb/python

Time:11-01

Note: i use flask / pymongo

How can i rearrange my data to output all of them in a single object separated by a comma. (see end of post for example).

I have a collection with data similar to this and i need to ouput all the number of times for example here, that sandwich is in the collection like this Sandwiches: 13 :

{
    "id":"J6qWt6XIUmIGFHX5rQJA-w",
    "categories":[
      {
        "alias":"sandwiches",
        "title":"Sandwiches"
      }
    ]
}

So with this first request :

restos.aggregate([{$unwind:"$categories"},
{$group:{_id:'$categories.title', count:{$sum:1}}}, 
{$project:{ type:"$_id", count: 1,_id:0}}])

I achieved to get an out put like this :

{ "count" : 3, "type" : "Sandwiches" }

But what i want is the type as a key and the count as a value, like this : { "Sandwiches" : 3 }

I was able to "partially make it works with that command but that's not really the format i want :

    .aggregate([{'$unwind': '$categories'},{'$group': {'_id': '$categories.title','count':{'$sum':
1}}},{'$project': {'type': '$_id', 'count': 1, '_id': 0}}, {'$replaceRoot': {'newRoot':
 {'$arrayToObject': [[{'k': '$type', 'v': '$count'}]]}}}]))

The output was :

{
  "restaurants": [
    {
      "Polish": 1
    }, 
    {
      "Salad": 3
    }, 
    {
      "Convenience Stores": 1
    }, 
    {
      "British": 2
    }]}

But my desired output is something like this that doesn't have the array and the data is contained into only 1 object:

{
    "restaurants":{
        Sandwiches: 13,
        pizza: 15,
        ...
    }

for the list thing i've come to realize that i use flask and when i return my jsonify object i put 'restaurants': list(db.restaurants.aggregate([ but when i remove it i get this error : TypeError: Object of type CommandCursor is not JSON serializable Any idea on how to do that ? thanks a lot :)

CodePudding user response:

If you can get a data like the following.

{ "count" : 13, "type" : "Sandwiches" }

You can do like this:

data = [{ "count" : 13, "type" : "Sandwiches" }, { "count" : 15, "type" : "Pizza" }]

output = {}
p = {}
for d in data:  # read each item in the list
    p.update({d['type']: d['count']})  # build a p dict with type key

output.update({'restaurants': p})  # build an output dict with restaurants key

print(output)
# {'restaurants': {'Sandwiches': 13, 'Pizza': 15}}
  • Related