Unwind dictionary values in mongodb aggregation framework












1















I need to create some plots from single documents existing in mongodb. I can only use the mongodb aggregation framework (so for example I cannot just pull the documents into python and work with it there). I am using the query builder of metabase, so I am limited from this regard.



In order to do this, I am first using some $match queries in order to identify the documents that I need to look at (these are predefined and static). After the $match stage, I am left with one document (this is ok) with the following structure.



{
"id": 1,
"locs": {
"a":1,
"b":2,
"c":3
}
}


I need to change this structure to something like this:



[{"a":1}, {"b":2}, {"c":3"}]



or any other form that would allow me to create pie charts out of the structure.



Thanks!










share|improve this question





























    1















    I need to create some plots from single documents existing in mongodb. I can only use the mongodb aggregation framework (so for example I cannot just pull the documents into python and work with it there). I am using the query builder of metabase, so I am limited from this regard.



    In order to do this, I am first using some $match queries in order to identify the documents that I need to look at (these are predefined and static). After the $match stage, I am left with one document (this is ok) with the following structure.



    {
    "id": 1,
    "locs": {
    "a":1,
    "b":2,
    "c":3
    }
    }


    I need to change this structure to something like this:



    [{"a":1}, {"b":2}, {"c":3"}]



    or any other form that would allow me to create pie charts out of the structure.



    Thanks!










    share|improve this question



























      1












      1








      1








      I need to create some plots from single documents existing in mongodb. I can only use the mongodb aggregation framework (so for example I cannot just pull the documents into python and work with it there). I am using the query builder of metabase, so I am limited from this regard.



      In order to do this, I am first using some $match queries in order to identify the documents that I need to look at (these are predefined and static). After the $match stage, I am left with one document (this is ok) with the following structure.



      {
      "id": 1,
      "locs": {
      "a":1,
      "b":2,
      "c":3
      }
      }


      I need to change this structure to something like this:



      [{"a":1}, {"b":2}, {"c":3"}]



      or any other form that would allow me to create pie charts out of the structure.



      Thanks!










      share|improve this question
















      I need to create some plots from single documents existing in mongodb. I can only use the mongodb aggregation framework (so for example I cannot just pull the documents into python and work with it there). I am using the query builder of metabase, so I am limited from this regard.



      In order to do this, I am first using some $match queries in order to identify the documents that I need to look at (these are predefined and static). After the $match stage, I am left with one document (this is ok) with the following structure.



      {
      "id": 1,
      "locs": {
      "a":1,
      "b":2,
      "c":3
      }
      }


      I need to change this structure to something like this:



      [{"a":1}, {"b":2}, {"c":3"}]



      or any other form that would allow me to create pie charts out of the structure.



      Thanks!







      mongodb mongodb-query aggregation-framework metabase






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 21 '18 at 17:17









      Anthony Winzlet

      17.4k42045




      17.4k42045










      asked Nov 21 '18 at 16:04









      Alex PopaAlex Popa

      235




      235
























          1 Answer
          1






          active

          oldest

          votes


















          1














          You can convert locs object to array using $objectToArray. Now $unwind the locs array to split into multiple documents. Use $group with $push accumulator to make the split data again into k and v format. And finally use $replaceRoot with the final data field to move it to $$ROOT position.



          db.collection.aggregate([
          { "$project": { "data": { "$objectToArray": "$locs" }}},
          { "$unwind": "$data" },
          { "$group": {
          "_id": "$data",
          "data": { "$push": { "k": "$data.k", "v": "$data.v" }}
          }},
          { "$project": {
          "data": { "$arrayToObject": "$data" }
          }},
          { "$replaceRoot": { "newRoot": "$data" }}
          ])





          share|improve this answer





















          • 1





            You rock! It worked almost perfectly, I just needed to add a { "$unwind": "$data" } before the $replaceRoot step.

            – Alex Popa
            Nov 21 '18 at 17:16













          • Can this be done in the aggregation pipeline without $objectToArray / $arrayToObject (prior to 3.4.4)?

            – Frayt
            Dec 11 '18 at 16:53











          • @Frayt No. It would be better if you update your mongo version because new versions are introduced for comfortableness

            – Anthony Winzlet
            Dec 11 '18 at 17:03











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53416040%2funwind-dictionary-values-in-mongodb-aggregation-framework%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          1














          You can convert locs object to array using $objectToArray. Now $unwind the locs array to split into multiple documents. Use $group with $push accumulator to make the split data again into k and v format. And finally use $replaceRoot with the final data field to move it to $$ROOT position.



          db.collection.aggregate([
          { "$project": { "data": { "$objectToArray": "$locs" }}},
          { "$unwind": "$data" },
          { "$group": {
          "_id": "$data",
          "data": { "$push": { "k": "$data.k", "v": "$data.v" }}
          }},
          { "$project": {
          "data": { "$arrayToObject": "$data" }
          }},
          { "$replaceRoot": { "newRoot": "$data" }}
          ])





          share|improve this answer





















          • 1





            You rock! It worked almost perfectly, I just needed to add a { "$unwind": "$data" } before the $replaceRoot step.

            – Alex Popa
            Nov 21 '18 at 17:16













          • Can this be done in the aggregation pipeline without $objectToArray / $arrayToObject (prior to 3.4.4)?

            – Frayt
            Dec 11 '18 at 16:53











          • @Frayt No. It would be better if you update your mongo version because new versions are introduced for comfortableness

            – Anthony Winzlet
            Dec 11 '18 at 17:03
















          1














          You can convert locs object to array using $objectToArray. Now $unwind the locs array to split into multiple documents. Use $group with $push accumulator to make the split data again into k and v format. And finally use $replaceRoot with the final data field to move it to $$ROOT position.



          db.collection.aggregate([
          { "$project": { "data": { "$objectToArray": "$locs" }}},
          { "$unwind": "$data" },
          { "$group": {
          "_id": "$data",
          "data": { "$push": { "k": "$data.k", "v": "$data.v" }}
          }},
          { "$project": {
          "data": { "$arrayToObject": "$data" }
          }},
          { "$replaceRoot": { "newRoot": "$data" }}
          ])





          share|improve this answer





















          • 1





            You rock! It worked almost perfectly, I just needed to add a { "$unwind": "$data" } before the $replaceRoot step.

            – Alex Popa
            Nov 21 '18 at 17:16













          • Can this be done in the aggregation pipeline without $objectToArray / $arrayToObject (prior to 3.4.4)?

            – Frayt
            Dec 11 '18 at 16:53











          • @Frayt No. It would be better if you update your mongo version because new versions are introduced for comfortableness

            – Anthony Winzlet
            Dec 11 '18 at 17:03














          1












          1








          1







          You can convert locs object to array using $objectToArray. Now $unwind the locs array to split into multiple documents. Use $group with $push accumulator to make the split data again into k and v format. And finally use $replaceRoot with the final data field to move it to $$ROOT position.



          db.collection.aggregate([
          { "$project": { "data": { "$objectToArray": "$locs" }}},
          { "$unwind": "$data" },
          { "$group": {
          "_id": "$data",
          "data": { "$push": { "k": "$data.k", "v": "$data.v" }}
          }},
          { "$project": {
          "data": { "$arrayToObject": "$data" }
          }},
          { "$replaceRoot": { "newRoot": "$data" }}
          ])





          share|improve this answer















          You can convert locs object to array using $objectToArray. Now $unwind the locs array to split into multiple documents. Use $group with $push accumulator to make the split data again into k and v format. And finally use $replaceRoot with the final data field to move it to $$ROOT position.



          db.collection.aggregate([
          { "$project": { "data": { "$objectToArray": "$locs" }}},
          { "$unwind": "$data" },
          { "$group": {
          "_id": "$data",
          "data": { "$push": { "k": "$data.k", "v": "$data.v" }}
          }},
          { "$project": {
          "data": { "$arrayToObject": "$data" }
          }},
          { "$replaceRoot": { "newRoot": "$data" }}
          ])






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 21 '18 at 17:04

























          answered Nov 21 '18 at 16:54









          Anthony WinzletAnthony Winzlet

          17.4k42045




          17.4k42045








          • 1





            You rock! It worked almost perfectly, I just needed to add a { "$unwind": "$data" } before the $replaceRoot step.

            – Alex Popa
            Nov 21 '18 at 17:16













          • Can this be done in the aggregation pipeline without $objectToArray / $arrayToObject (prior to 3.4.4)?

            – Frayt
            Dec 11 '18 at 16:53











          • @Frayt No. It would be better if you update your mongo version because new versions are introduced for comfortableness

            – Anthony Winzlet
            Dec 11 '18 at 17:03














          • 1





            You rock! It worked almost perfectly, I just needed to add a { "$unwind": "$data" } before the $replaceRoot step.

            – Alex Popa
            Nov 21 '18 at 17:16













          • Can this be done in the aggregation pipeline without $objectToArray / $arrayToObject (prior to 3.4.4)?

            – Frayt
            Dec 11 '18 at 16:53











          • @Frayt No. It would be better if you update your mongo version because new versions are introduced for comfortableness

            – Anthony Winzlet
            Dec 11 '18 at 17:03








          1




          1





          You rock! It worked almost perfectly, I just needed to add a { "$unwind": "$data" } before the $replaceRoot step.

          – Alex Popa
          Nov 21 '18 at 17:16







          You rock! It worked almost perfectly, I just needed to add a { "$unwind": "$data" } before the $replaceRoot step.

          – Alex Popa
          Nov 21 '18 at 17:16















          Can this be done in the aggregation pipeline without $objectToArray / $arrayToObject (prior to 3.4.4)?

          – Frayt
          Dec 11 '18 at 16:53





          Can this be done in the aggregation pipeline without $objectToArray / $arrayToObject (prior to 3.4.4)?

          – Frayt
          Dec 11 '18 at 16:53













          @Frayt No. It would be better if you update your mongo version because new versions are introduced for comfortableness

          – Anthony Winzlet
          Dec 11 '18 at 17:03





          @Frayt No. It would be better if you update your mongo version because new versions are introduced for comfortableness

          – Anthony Winzlet
          Dec 11 '18 at 17:03




















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53416040%2funwind-dictionary-values-in-mongodb-aggregation-framework%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          這個網誌中的熱門文章

          Xamarin.form Move up view when keyboard appear

          Post-Redirect-Get with Spring WebFlux and Thymeleaf

          Anylogic : not able to use stopDelay()