MongoDB - Rewind an $unwind nested array after $lookup using $groupIf Mongo $lookup is a left outer join, then how come it excludes non-matching documents?Retrieve only the queried element in an object array in MongoDB collectionFind MongoDB records where array field is not emptyWhat's the $unwind operator in MongoDB?How to use nested grouping in MongoDBmongodb aggregation - unwind/group/project query combination$lookup on nested array of Objects$lookup nested array in mongodbUnwinding two nested array mongodb nodejs in group$unwind and $lookup with php mongodb
Permutations in Disguise
How to give my students a straightedge instead of a ruler
What does "boys rule, girls drool" mean?
Shouldn't countries like Russia and Canada support global warming?
How clean are pets?
Is it appropriate to CC a lot of people on an email
Unable to find solution to 6 simultaneous equations
Can derivatives be defined as anti-integrals?
'Overwrote' files, space still occupied, are they lost?
Why any infinite sequence of real functions can be generated from a finite set through composition?
What is the mathematical notation for rounding a given number to the nearest integer?
Why is this sentence grammatical?
Examples of proofs by making reduction to a finite set
Seven Places at Once - Another Google Earth Challenge?
Asked to Not Use Transactions and to Use A Workaround to Simulate One
Why is my fire extinguisher emptied after one use?
Importance of the current postdoc advisor's letter in TT job search
2000s space film where an alien species has almost wiped out the human race in a war
Where is it? - The Google Earth Challenge Ep. 3
What 68-pin connector is this on my 2.5" solid state drive?
Some Prime Peerage
What organs or modifications would be needed for a life biological creature not to require sleep?
How to draw a Venn diagram for X - (Y intersect Z)?
International Orange?
MongoDB - Rewind an $unwind nested array after $lookup using $group
If Mongo $lookup is a left outer join, then how come it excludes non-matching documents?Retrieve only the queried element in an object array in MongoDB collectionFind MongoDB records where array field is not emptyWhat's the $unwind operator in MongoDB?How to use nested grouping in MongoDBmongodb aggregation - unwind/group/project query combination$lookup on nested array of Objects$lookup nested array in mongodbUnwinding two nested array mongodb nodejs in group$unwind and $lookup with php mongodb
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
MongoDB aggregation gets exponentially complicated by the minute!
I am in so far as to $unwind
a nested array and then perform a $lookup
by the _id
of each object from the unwinded nested array. My final attempt is to reverse the unwinding with $group
. However, I am unable to reconstruct the original embedded array, with its original property name, along with the rest of the original immediate properties of each document.
Here is my attempt so far:
db.users.aggregate([
$unwind: "$profile",
$unwind:
path: "$profile.universities",
preserveNullAndEmptyArrays: true
,
$lookup:
from: "universities",
localField: "profile.universities._id",
foreignField: "_id",
as: "profile.universities"
,
$group:
_id: "$_id",
emails: "$first": "$emails" ,
profile: "$first": "$profile" ,
universities: "$push": "$profile.universities"
]).pretty()
What I get is something like this:
"_id" : "A_USER_ID",
"emails" : [
"address" : "AN_EMAIL_ADDRESS",
"verified" : false
],
"profile" :
"name" : "NAME",
"company" : "A COMPANY",
"title" : "A TITLE",
"phone" : "123-123-1234",
"disabled" : false,
"universities" : [
"_id" : "ID_1",
"name" : "UNIVERSITY_NAME_1",
"code" : "CODE_1",
"styles" : AN_OBJECT
]
,
"universities" : [
[
"_id" : "ID_1",
"name" : "UNIVERSITY_NAME_1",
"code" : "CODE_1",
"styles" : AN_OBJECT
],
[
"_id" : "ID_2",
"name" : "UNIVERSITY_NAME_2",
"code" : "CODE_2",
"styles" : AN_OBJECT
]
]
There are 2 issues with this result:
- The resulting
universities
is an array of arrays of one object each, since the$lookup
returned a single element array for the original$profile.universities
nested array. It should be just an array of objects. - The resulting
universities
should take its original place as nested underprofiles
. I am aware why the originalprofile.universities
is the way it is, because I am using the$first
operator. My intent behind this is to retain all of the original properties ofprofile
, in junction with retaining the original nesteduniversities
array.
Ultimately, what I need is something like this:
"_id" : "A_USER_ID",
"emails" : [
"address" : "AN_EMAIL_ADDRESS",
"verified" : false
],
"profile" :
"name" : "NAME",
"company" : "A COMPANY",
"title" : "A TITLE",
"phone" : "123-123-1234",
"disabled" : false,
"universities" : [
"_id" : "ID_1",
"name" : "UNIVERSITY_NAME_1",
"code" : "CODE_1",
"styles" : AN_OBJECT
,
"_id" : "ID_2",
"name" : "UNIVERSITY_NAME_2",
"code" : "CODE_2",
"styles" : AN_OBJECT
]
Is there another operator that I can use instead of $group
to achieve this? Or am I understanding the purpose of $group
incorrectly?
Edit: This is the original post, for context:
If Mongo $lookup is a left outer join, then how come it excludes non-matching documents?
mongodb join mongodb-query aggregation-framework mongodb-aggregation
add a comment
|
MongoDB aggregation gets exponentially complicated by the minute!
I am in so far as to $unwind
a nested array and then perform a $lookup
by the _id
of each object from the unwinded nested array. My final attempt is to reverse the unwinding with $group
. However, I am unable to reconstruct the original embedded array, with its original property name, along with the rest of the original immediate properties of each document.
Here is my attempt so far:
db.users.aggregate([
$unwind: "$profile",
$unwind:
path: "$profile.universities",
preserveNullAndEmptyArrays: true
,
$lookup:
from: "universities",
localField: "profile.universities._id",
foreignField: "_id",
as: "profile.universities"
,
$group:
_id: "$_id",
emails: "$first": "$emails" ,
profile: "$first": "$profile" ,
universities: "$push": "$profile.universities"
]).pretty()
What I get is something like this:
"_id" : "A_USER_ID",
"emails" : [
"address" : "AN_EMAIL_ADDRESS",
"verified" : false
],
"profile" :
"name" : "NAME",
"company" : "A COMPANY",
"title" : "A TITLE",
"phone" : "123-123-1234",
"disabled" : false,
"universities" : [
"_id" : "ID_1",
"name" : "UNIVERSITY_NAME_1",
"code" : "CODE_1",
"styles" : AN_OBJECT
]
,
"universities" : [
[
"_id" : "ID_1",
"name" : "UNIVERSITY_NAME_1",
"code" : "CODE_1",
"styles" : AN_OBJECT
],
[
"_id" : "ID_2",
"name" : "UNIVERSITY_NAME_2",
"code" : "CODE_2",
"styles" : AN_OBJECT
]
]
There are 2 issues with this result:
- The resulting
universities
is an array of arrays of one object each, since the$lookup
returned a single element array for the original$profile.universities
nested array. It should be just an array of objects. - The resulting
universities
should take its original place as nested underprofiles
. I am aware why the originalprofile.universities
is the way it is, because I am using the$first
operator. My intent behind this is to retain all of the original properties ofprofile
, in junction with retaining the original nesteduniversities
array.
Ultimately, what I need is something like this:
"_id" : "A_USER_ID",
"emails" : [
"address" : "AN_EMAIL_ADDRESS",
"verified" : false
],
"profile" :
"name" : "NAME",
"company" : "A COMPANY",
"title" : "A TITLE",
"phone" : "123-123-1234",
"disabled" : false,
"universities" : [
"_id" : "ID_1",
"name" : "UNIVERSITY_NAME_1",
"code" : "CODE_1",
"styles" : AN_OBJECT
,
"_id" : "ID_2",
"name" : "UNIVERSITY_NAME_2",
"code" : "CODE_2",
"styles" : AN_OBJECT
]
Is there another operator that I can use instead of $group
to achieve this? Or am I understanding the purpose of $group
incorrectly?
Edit: This is the original post, for context:
If Mongo $lookup is a left outer join, then how come it excludes non-matching documents?
mongodb join mongodb-query aggregation-framework mongodb-aggregation
add a comment
|
MongoDB aggregation gets exponentially complicated by the minute!
I am in so far as to $unwind
a nested array and then perform a $lookup
by the _id
of each object from the unwinded nested array. My final attempt is to reverse the unwinding with $group
. However, I am unable to reconstruct the original embedded array, with its original property name, along with the rest of the original immediate properties of each document.
Here is my attempt so far:
db.users.aggregate([
$unwind: "$profile",
$unwind:
path: "$profile.universities",
preserveNullAndEmptyArrays: true
,
$lookup:
from: "universities",
localField: "profile.universities._id",
foreignField: "_id",
as: "profile.universities"
,
$group:
_id: "$_id",
emails: "$first": "$emails" ,
profile: "$first": "$profile" ,
universities: "$push": "$profile.universities"
]).pretty()
What I get is something like this:
"_id" : "A_USER_ID",
"emails" : [
"address" : "AN_EMAIL_ADDRESS",
"verified" : false
],
"profile" :
"name" : "NAME",
"company" : "A COMPANY",
"title" : "A TITLE",
"phone" : "123-123-1234",
"disabled" : false,
"universities" : [
"_id" : "ID_1",
"name" : "UNIVERSITY_NAME_1",
"code" : "CODE_1",
"styles" : AN_OBJECT
]
,
"universities" : [
[
"_id" : "ID_1",
"name" : "UNIVERSITY_NAME_1",
"code" : "CODE_1",
"styles" : AN_OBJECT
],
[
"_id" : "ID_2",
"name" : "UNIVERSITY_NAME_2",
"code" : "CODE_2",
"styles" : AN_OBJECT
]
]
There are 2 issues with this result:
- The resulting
universities
is an array of arrays of one object each, since the$lookup
returned a single element array for the original$profile.universities
nested array. It should be just an array of objects. - The resulting
universities
should take its original place as nested underprofiles
. I am aware why the originalprofile.universities
is the way it is, because I am using the$first
operator. My intent behind this is to retain all of the original properties ofprofile
, in junction with retaining the original nesteduniversities
array.
Ultimately, what I need is something like this:
"_id" : "A_USER_ID",
"emails" : [
"address" : "AN_EMAIL_ADDRESS",
"verified" : false
],
"profile" :
"name" : "NAME",
"company" : "A COMPANY",
"title" : "A TITLE",
"phone" : "123-123-1234",
"disabled" : false,
"universities" : [
"_id" : "ID_1",
"name" : "UNIVERSITY_NAME_1",
"code" : "CODE_1",
"styles" : AN_OBJECT
,
"_id" : "ID_2",
"name" : "UNIVERSITY_NAME_2",
"code" : "CODE_2",
"styles" : AN_OBJECT
]
Is there another operator that I can use instead of $group
to achieve this? Or am I understanding the purpose of $group
incorrectly?
Edit: This is the original post, for context:
If Mongo $lookup is a left outer join, then how come it excludes non-matching documents?
mongodb join mongodb-query aggregation-framework mongodb-aggregation
MongoDB aggregation gets exponentially complicated by the minute!
I am in so far as to $unwind
a nested array and then perform a $lookup
by the _id
of each object from the unwinded nested array. My final attempt is to reverse the unwinding with $group
. However, I am unable to reconstruct the original embedded array, with its original property name, along with the rest of the original immediate properties of each document.
Here is my attempt so far:
db.users.aggregate([
$unwind: "$profile",
$unwind:
path: "$profile.universities",
preserveNullAndEmptyArrays: true
,
$lookup:
from: "universities",
localField: "profile.universities._id",
foreignField: "_id",
as: "profile.universities"
,
$group:
_id: "$_id",
emails: "$first": "$emails" ,
profile: "$first": "$profile" ,
universities: "$push": "$profile.universities"
]).pretty()
What I get is something like this:
"_id" : "A_USER_ID",
"emails" : [
"address" : "AN_EMAIL_ADDRESS",
"verified" : false
],
"profile" :
"name" : "NAME",
"company" : "A COMPANY",
"title" : "A TITLE",
"phone" : "123-123-1234",
"disabled" : false,
"universities" : [
"_id" : "ID_1",
"name" : "UNIVERSITY_NAME_1",
"code" : "CODE_1",
"styles" : AN_OBJECT
]
,
"universities" : [
[
"_id" : "ID_1",
"name" : "UNIVERSITY_NAME_1",
"code" : "CODE_1",
"styles" : AN_OBJECT
],
[
"_id" : "ID_2",
"name" : "UNIVERSITY_NAME_2",
"code" : "CODE_2",
"styles" : AN_OBJECT
]
]
There are 2 issues with this result:
- The resulting
universities
is an array of arrays of one object each, since the$lookup
returned a single element array for the original$profile.universities
nested array. It should be just an array of objects. - The resulting
universities
should take its original place as nested underprofiles
. I am aware why the originalprofile.universities
is the way it is, because I am using the$first
operator. My intent behind this is to retain all of the original properties ofprofile
, in junction with retaining the original nesteduniversities
array.
Ultimately, what I need is something like this:
"_id" : "A_USER_ID",
"emails" : [
"address" : "AN_EMAIL_ADDRESS",
"verified" : false
],
"profile" :
"name" : "NAME",
"company" : "A COMPANY",
"title" : "A TITLE",
"phone" : "123-123-1234",
"disabled" : false,
"universities" : [
"_id" : "ID_1",
"name" : "UNIVERSITY_NAME_1",
"code" : "CODE_1",
"styles" : AN_OBJECT
,
"_id" : "ID_2",
"name" : "UNIVERSITY_NAME_2",
"code" : "CODE_2",
"styles" : AN_OBJECT
]
Is there another operator that I can use instead of $group
to achieve this? Or am I understanding the purpose of $group
incorrectly?
Edit: This is the original post, for context:
If Mongo $lookup is a left outer join, then how come it excludes non-matching documents?
mongodb join mongodb-query aggregation-framework mongodb-aggregation
mongodb join mongodb-query aggregation-framework mongodb-aggregation
edited May 23 '17 at 12:24
Community♦
11 silver badge
11 silver badge
asked Sep 14 '16 at 13:14
Sun LeeSun Lee
2241 gold badge3 silver badges15 bronze badges
2241 gold badge3 silver badges15 bronze badges
add a comment
|
add a comment
|
1 Answer
1
active
oldest
votes
Because the $lookup
operator produces an array field, you need to $unwind
the new field before the $group
pipeline to get the desired result:
db.users.aggregate([
"$unwind": "$profile" ,
"$unwind":
"path": "$profile.universities",
"preserveNullAndEmptyArrays": true
,
"$lookup":
"from": "universities",
"localField": "profile.universities._id",
"foreignField": "_id",
"as": "universities"
,
"$unwind": "$universities" ,
"$group":
"_id": "$_id",
"emails": "$first": "$emails" ,
"profile": "$first": "$profile" ,
"universities": "$push": "$universities"
,
"$project":
"emails": 1,
"profile.name" : 1,
"profile.company": 1,
"profile.title" : 1,
"profile.phone" : 1,
"profile.disabled": 1,
"profile.universities": "$universities"
]).pretty()
3
Thanks @chridam, the second$unwind
and$project
did the trick! I had to modify two parts: 1. change the second unwind to"$unwind": "path": "$profile.universities", "preserveNullAndEmptyArrays": true
, and 2. change the$group
"universities" to"universities": "$push": "$profile.universities"
and I was able to get my results.
– Sun Lee
Sep 14 '16 at 16:53
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/4.0/"u003ecc by-sa 4.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%2f39491447%2fmongodb-rewind-an-unwind-nested-array-after-lookup-using-group%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
Because the $lookup
operator produces an array field, you need to $unwind
the new field before the $group
pipeline to get the desired result:
db.users.aggregate([
"$unwind": "$profile" ,
"$unwind":
"path": "$profile.universities",
"preserveNullAndEmptyArrays": true
,
"$lookup":
"from": "universities",
"localField": "profile.universities._id",
"foreignField": "_id",
"as": "universities"
,
"$unwind": "$universities" ,
"$group":
"_id": "$_id",
"emails": "$first": "$emails" ,
"profile": "$first": "$profile" ,
"universities": "$push": "$universities"
,
"$project":
"emails": 1,
"profile.name" : 1,
"profile.company": 1,
"profile.title" : 1,
"profile.phone" : 1,
"profile.disabled": 1,
"profile.universities": "$universities"
]).pretty()
3
Thanks @chridam, the second$unwind
and$project
did the trick! I had to modify two parts: 1. change the second unwind to"$unwind": "path": "$profile.universities", "preserveNullAndEmptyArrays": true
, and 2. change the$group
"universities" to"universities": "$push": "$profile.universities"
and I was able to get my results.
– Sun Lee
Sep 14 '16 at 16:53
add a comment
|
Because the $lookup
operator produces an array field, you need to $unwind
the new field before the $group
pipeline to get the desired result:
db.users.aggregate([
"$unwind": "$profile" ,
"$unwind":
"path": "$profile.universities",
"preserveNullAndEmptyArrays": true
,
"$lookup":
"from": "universities",
"localField": "profile.universities._id",
"foreignField": "_id",
"as": "universities"
,
"$unwind": "$universities" ,
"$group":
"_id": "$_id",
"emails": "$first": "$emails" ,
"profile": "$first": "$profile" ,
"universities": "$push": "$universities"
,
"$project":
"emails": 1,
"profile.name" : 1,
"profile.company": 1,
"profile.title" : 1,
"profile.phone" : 1,
"profile.disabled": 1,
"profile.universities": "$universities"
]).pretty()
3
Thanks @chridam, the second$unwind
and$project
did the trick! I had to modify two parts: 1. change the second unwind to"$unwind": "path": "$profile.universities", "preserveNullAndEmptyArrays": true
, and 2. change the$group
"universities" to"universities": "$push": "$profile.universities"
and I was able to get my results.
– Sun Lee
Sep 14 '16 at 16:53
add a comment
|
Because the $lookup
operator produces an array field, you need to $unwind
the new field before the $group
pipeline to get the desired result:
db.users.aggregate([
"$unwind": "$profile" ,
"$unwind":
"path": "$profile.universities",
"preserveNullAndEmptyArrays": true
,
"$lookup":
"from": "universities",
"localField": "profile.universities._id",
"foreignField": "_id",
"as": "universities"
,
"$unwind": "$universities" ,
"$group":
"_id": "$_id",
"emails": "$first": "$emails" ,
"profile": "$first": "$profile" ,
"universities": "$push": "$universities"
,
"$project":
"emails": 1,
"profile.name" : 1,
"profile.company": 1,
"profile.title" : 1,
"profile.phone" : 1,
"profile.disabled": 1,
"profile.universities": "$universities"
]).pretty()
Because the $lookup
operator produces an array field, you need to $unwind
the new field before the $group
pipeline to get the desired result:
db.users.aggregate([
"$unwind": "$profile" ,
"$unwind":
"path": "$profile.universities",
"preserveNullAndEmptyArrays": true
,
"$lookup":
"from": "universities",
"localField": "profile.universities._id",
"foreignField": "_id",
"as": "universities"
,
"$unwind": "$universities" ,
"$group":
"_id": "$_id",
"emails": "$first": "$emails" ,
"profile": "$first": "$profile" ,
"universities": "$push": "$universities"
,
"$project":
"emails": 1,
"profile.name" : 1,
"profile.company": 1,
"profile.title" : 1,
"profile.phone" : 1,
"profile.disabled": 1,
"profile.universities": "$universities"
]).pretty()
edited Aug 7 at 15:21
answered Sep 14 '16 at 13:56
chridamchridam
73.1k16 gold badges122 silver badges160 bronze badges
73.1k16 gold badges122 silver badges160 bronze badges
3
Thanks @chridam, the second$unwind
and$project
did the trick! I had to modify two parts: 1. change the second unwind to"$unwind": "path": "$profile.universities", "preserveNullAndEmptyArrays": true
, and 2. change the$group
"universities" to"universities": "$push": "$profile.universities"
and I was able to get my results.
– Sun Lee
Sep 14 '16 at 16:53
add a comment
|
3
Thanks @chridam, the second$unwind
and$project
did the trick! I had to modify two parts: 1. change the second unwind to"$unwind": "path": "$profile.universities", "preserveNullAndEmptyArrays": true
, and 2. change the$group
"universities" to"universities": "$push": "$profile.universities"
and I was able to get my results.
– Sun Lee
Sep 14 '16 at 16:53
3
3
Thanks @chridam, the second
$unwind
and $project
did the trick! I had to modify two parts: 1. change the second unwind to "$unwind": "path": "$profile.universities", "preserveNullAndEmptyArrays": true
, and 2. change the $group
"universities" to "universities": "$push": "$profile.universities"
and I was able to get my results.– Sun Lee
Sep 14 '16 at 16:53
Thanks @chridam, the second
$unwind
and $project
did the trick! I had to modify two parts: 1. change the second unwind to "$unwind": "path": "$profile.universities", "preserveNullAndEmptyArrays": true
, and 2. change the $group
"universities" to "universities": "$push": "$profile.universities"
and I was able to get my results.– Sun Lee
Sep 14 '16 at 16:53
add a comment
|
Got a question that you can’t ask on public Stack Overflow? Learn more about sharing private information with Stack Overflow for Teams.
Got a question that you can’t ask on public Stack Overflow? Learn more about sharing private information with Stack Overflow for Teams.
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%2f39491447%2fmongodb-rewind-an-unwind-nested-array-after-lookup-using-group%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