Unwind dictionary values in mongodb aggregation framework
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
add a comment |
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
add a comment |
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
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
mongodb mongodb-query aggregation-framework metabase
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
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
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" }}
])
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
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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" }}
])
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
add a comment |
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" }}
])
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
add a comment |
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" }}
])
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" }}
])
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
add a comment |
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
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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