Primer
, "", "" | Unix . "" "" ..
, , , "" , , , .
all_service . , "" , "", "all_sub_item". , , "all_sub_item" , .
"" SQL, " ". " " , . .
, "" , "-" , SQL, "" "". "" - , .
, . , "" " " , "". " " :
{
"a": 1,
"b": [
{
"c": 1,
"d": [
{ "e": 1 }, { "e": 2 }
]
},
{
"c": 2,
"d": [
{ "e": 1 }, { "e": 2 }
]
}
]
}
:
{ "a" : 1, "b" : { "c" : 1, "d" : { "e" : 1 } } }
{ "a" : 1, "b" : { "c" : 1, "d" : { "e" : 2 } } }
{ "a" : 1, "b" : { "c" : 2, "d" : { "e" : 1 } } }
{ "a" : 1, "b" : { "c" : 2, "d" : { "e" : 2 } } }
- $unwind, , $unwind :
db.collection.aggregate([
{ "$unwind": "$b" },
{ "$unwind": "$b.d" }
])
, "pipe" "$ b" :
{ "a" : 1, "b" : { "c" : 1, "d" : [ { "e" : 1 }, { "e" : 2 } ] } }
{ "a" : 1, "b" : { "c" : 2, "d" : [ { "e" : 1 }, { "e" : 2 } ] } }
, "$ b.d", " - ". .
"" "" , , "" , . , , $unwind, , .
, "user_id" . , , , .
, "" , , . "", " " - . , "" , , "-", actualy "" .
, "" $match "", $match , "" $unwind, , .
Job.aggregate(
[
{ "$match": {
"all_service.all_sub_item.owner": given_user_id
}},
{ "$unwind": "$all_service" },
{ "$unwind": "$all_service.all_subitem" },
{ "$match": {
"all_service.all_sub_item.owner": given_user_id
}},
{ "$group": {
"_id": null,
"total": { "$sum": "$all_service.all_sub_item.price" }
}}
],
function(err,results) {
}
)
, MongoDB 2.6 $redact. " " $unwind:
Job.aggregate(
[
{ "$match": {
"all_service.all_sub_item.owner": given_user_id
}},
{ "$redact": {
"$cond": {
"if": {
"$eq": [
{ "$ifNull": [ "$owner", given_user_id ] },
given_user_id
]
},
"then": "$$DESCEND",
"else": "$$PRUNE"
}
}},
{ "$unwind": "$all_service" },
{ "$unwind": "$all_service.all_subitem" },
{ "$group": {
"_id": null,
"total": { "$sum": "$all_service.all_sub_item.price" }
}}
],
function(err,results) {
}
)
"" , "" $unwind. , , , "". "" , - "" , "". $match , :
Job.aggregate(
[
{ "$match": {
"all_service.all_sub_item.owner": given_user_id
}},
{ "$project": {
"all_items": {
"$setDifference": [
{ "$map": {
"input": "$all_service",
"as": "A",
"in": {
"$setDifference": [
{ "$map": {
"input": "$$A.all_sub_item",
"as": "B",
"in": {
"$cond": {
"if": { "$eq": [ "$$B.owner", given_user_id ] },
"then": "$$B",
"else": false
}
}
}},
false
]
}
}},
[[]]
]
}
}},
{ "$unwind": "$all_items" },
{ "$unwind": "$all_items" },
{ "$group": {
"_id": null,
"total": { "$sum": "$all_items.price" }
}}
],
function(err,results) {
}
)
"" $redact. $map "in". "" $map "" .
$cond, , "", inner "array elment, false.
$setDifference false. "" "" , false, "", . , "" , :
[[{ "_id": 1, "price": 1, "owner": "b" },{..}],[{..},{..}]]
"" _id mongoose ( , ), "" "set", .
$unwind "", , .
, , . , "" , "-" .