Mongo projection for only field and value

Viewed 164

I have large documents and I want to project them with only field and value.

It goes like this;

{"p":{"s":{"status":"b"},"m":{"pd":{"tt":{"bi":"2","psi":"4","ircsi":true}},"mi":"TT","et":"2020-09-07T14:34:00+03:00"}}}
{"p":{"s":{"status":"b"},"m":{"pd":{"tt":{"bi":"20","psi":"1","ircsi":true}},"mi":"TT","et":"2020-12-29T08:28:06+03:00"}}}
.........

Is there any way for its to look like this;

{"status":"b","bi":"2","psi":"4","ircsi":true,"mi":"TT","et":"2020-09-07T14:34:00+03:00"}}}
{"status":"b","bi":"20","psi":"1","ircsi":true,"mi":"TT","et":"2020-09-07T14:34:00+03:00"}}}
.........

And my query is like this;

db.s.aggregate([{
    "$match": { 
        "p.m.etm": {
            "$gt": 1585688401000,
            "$lt": 1610565947499
        },
        "p.m.mi":"TT"
    }
},
{
    "$project": {
        "p.m.pd.tt.bi": 1,
        "p.m.pd.tt.psi": 1,
        "p.m.pd.tt.ircsi": 1,
        "p.m.mi":1,
        "p.s.status":1,
        "p.m.et":1,
        "_id": 0
    }
}],
{
    "allowDiskUse": true
});

What should I change to reach what I need ?

1 Answers

You can use $project to create new fields. (I just remove $match for easiness)

db.collection.aggregate([
  {
    "$project": {
      "bi": "$p.m.pd.tt.bi",
      "psi": "$p.m.pd.tt.psi",
      "ircsi": "$p.m.pd.tt.ircsi",
      "mi": "$p.m.mi",
      "status": "$p.s.status",
      "et": "$p.m.et",
      "_id": 0
    }
  }
])

Working Mongo playground

Related