Show
Step 1. Make a collection called 'locations'
Step 2. Insert this document in the locations collection:
{
"_id" : "XqEQYpitGFG3nnf3C",
"wallpapers" : [
{
"_metadata" : {
"master" : "vwb22W4MhkqtvAp89",
"isMaster" : false
},
"role" : "master",
"_id" : ""
},
{
"_metadata" : {
"master" : "vwb22W4MhkqtvAp89",
"isMaster" : false
},
"role" : "clone",
"_id" : ""
},
{
"_metadata" : {
"master" : "vwb22W4MhkqtvAp89",
"isMaster" : false
},
"role" : "pod",
"_id" : ""
}
],
"ancestors" : [
"vwb22W4MhkqtvAp89",
"tqzqfum9uMs47xcHW",
"b4d83aqTkq6TGvXts",
"XqEQYpitGFG3nnf3C"
]
Step 3. Run this query:
b.getCollection( 'locations' ).update(
{
"ancestors" : "b4d83aqTkq6TGvXts" ,
"wallpapers" : {
"$elemMatch" : {
"role" : "clone" ,
"_metadata.master" : "vwb22W4MhkqtvAp89"
}
}
},
{
"$set" : {
"wallpapers.$" : {
"_id" : "D33WNZh7Bg4itPdhk" ,
"_metadata" : {
"master" : "b4d83aqTkq6TGvXts" ,
"isMaster" : false
},
"role" : "clone"
}
}
}
)
Step 4
Document is now:
{
"_id" : "XqEQYpitGFG3nnf3C",
"wallpapers" : [
{
"_metadata" : {
"master" : "vwb22W4MhkqtvAp89",
"isMaster" : false
},
"role" : "master",
"_id" : ""
},
{
"_metadata" : {
"master" : "vwb22W4MhkqtvAp89",
"isMaster" : false
},
"role" : "clone",
"_id" : ""
},
{
"_id" : "D33WNZh7Bg4itPdhk",
"_metadata" : {
"master" : "b4d83aqTkq6TGvXts",
"isMaster" : false
},
"role" : "clone"
}
],
"ancestors" : [
"vwb22W4MhkqtvAp89",
"tqzqfum9uMs47xcHW",
"b4d83aqTkq6TGvXts",
"XqEQYpitGFG3nnf3C"
]
}
So the `$` operator uses the index of the `ancestor` part of the update operation query, instead of the `wallpapers` one.