Try this
By referring your sample schema, it is array of documents of user_id's
Use $unwind to seperate the docs from array and filter the documents by using given user_id and whose value is negative.
Sample document
{
"_id" : ObjectId("582032556772b7cb0ff85721"),
"userArray" : [
{
"user_id" : "1",
"name" : "aaaa",
"value" : -10
},
{
"user_id" : "2",
"name" : "bbbb",
"value" : 30
},
{
"user_id" : "1",
"name" : "aaaa",
"value" : 310
},
{
"user_id" : "2",
"name" : "bbbb",
"value" : -15
},
{
"user_id" : "1",
"name" : "aaaa",
"value" : -100
},
{
"user_id" : "3",
"name" : "cccc",
"value" : 390
}
]
}
db.collection.aggregate([{$unwind:"userArray"}]);
The result of unwind on above data would be
{
"_id" : ObjectId("582032556772b7cb0ff85721"),
"userArray" : {
"user_id" : "1",
"name" : "aaaa",
"value" : -10
}
}
{
"_id" : ObjectId("582032556772b7cb0ff85721"),
"userArray" : {
"user_id" : "2",
"name" : "bbbb",
"value" : 30
}
}
{
"_id" : ObjectId("582032556772b7cb0ff85721"),
"userArray" : {
"user_id" : "1",
"name" : "aaaa",
"value" : 310
}
}
{
"_id" : ObjectId("582032556772b7cb0ff85721"),
"userArray" : {
"user_id" : "2",
"name" : "bbbb",
"value" : -15
}
}
{
"_id" : ObjectId("582032556772b7cb0ff85721"),
"userArray" : {
"user_id" : "1",
"name" : "aaaa",
"value" : -100
}
}
{
"_id" : ObjectId("582032556772b7cb0ff85721"),
"userArray" : {
"user_id" : "3",
"name" : "cccc",
"value" : 390
}
}
Then apply the condition of that is user_id and value is negative. For this we can use $match together with $and (since we have two conditions value and id)
db.collection.aggregate([{$unwind:"$userArray"}, {$match:{$and: [{"userArray.value":{$lte:0}}, {"userArray.user_id":"1"}]}} ]);
for user_id: 1 the query result is
{
"_id" : ObjectId("582032556772b7cb0ff85721"),
"userArray" : {
"user_id" : "1",
"name" : "aaaa",
"value" : -10
}
}
{
"_id" : ObjectId("582032556772b7cb0ff85721"),
"userArray" : {
"user_id" : "1",
"name" : "aaaa",
"value" : -100
}
}
With this result you have to iterate it in your service layer and work on the other desired results.
Hope it helps!