I need to remove item in nested array, following is my document
{
"_id" : ObjectId("58760d8caa30c585ef8d3beb"),
"results" : [
{
"item" : "A",
"score" : 5.0,
"answers" : [
{
"q" : 1.0,
"a" : 4.0
},
{
"q" : 1.0,
"a" : 5.0
},
{
"q" : 2.0,
"a" : 6.0
}
]
},
{
"item" : "B",
"score" : 8.0,
"answers" : [
{
"q" : 1.0,
"a" : 7.0
},
{
"q" : 1.0,
"a" : 5.0
},
{
"q" : 2.0,
"a" : 9.0
}
]
}
]
}
I want to remove all item in answers which q equal 1.0, following is expect document:
{
"_id" : ObjectId("58760d8caa30c585ef8d3beb"),
"results" : [
{
"item" : "A",
"score" : 5.0,
"answers" : [
{
"q" : 2.0,
"a" : 6.0
}
]
},
{
"item" : "B",
"score" : 8.0,
"answers" : [
{
"q" : 2.0,
"a" : 9.0
}
]
}
]
}
I used:
db.getCollection('test').update({"results.answers.q":1},
{ $pull: {"results.$.answers": {q:1} } },
{ multi: true })
But got:
{
"_id" : ObjectId("58760d8caa30c585ef8d3beb"),
"results" : [
{
"item" : "A",
"score" : 5.0,
"answers" : [
{
"q" : 2.0,
"a" : 6.0
}
]
},
{
"item" : "B",
"score" : 8.0,
"answers" : [
{
"q" : 1.0,
"a" : 7.0
},
{
"q" : 1.0,
"a" : 5.0
},
{
"q" : 2.0,
"a" : 9.0
}
]
}
]
}
in item B there still have embed documents which q equal 1
How can I do?
Unfortunately, there is no way to achieve this result with a single query, unless someone can think of something really smart with $where operator. Usage of positional operator implies that you can only target a single array element (in your case it is a single results element), and this usage is a must in any subarray pulls.
An ugly workaround here is to perform this update N times where N is the length of results array. This approach will do the job, but obviously it will be a huge performance issue if these arrays are large.
using the below query will work for you. For more info regarding $pull please visit https://docs.mongodb.com/manual/reference/operator/update/pull/
db.getCollection('test').update({},{ $pull: {"results":{"answers": {$elemMatch:{q:1} }} }},{ multi: true });
You can now achieve this with $pull, as per the MongoDB docs: https://docs.mongodb.com/manual/reference/operator/update/pull/#pull-array-of-documents