,
, :
{
"_id" : ObjectId("538181738d6bd23253654690"),
"movies": [
{ "_id": 1, "rating": 5 },
{ "_id": 2, "rating": 6 },
{ "_id": 3, "rating": 7 }
]
},
{
"_id" : ObjectId("538181738d6bd23253654691"),
"movies": [
{ "_id": 1, "rating": 5 },
{ "_id": 4, "rating": 6 },
{ "_id": 2, "rating": 7 }
]
},
{
"_id" : ObjectId("538181738d6bd23253654692"),
"movies": [
{ "_id": 2, "rating": 5 },
{ "_id": 5, "rating": 6 },
{ "_id": 6, "rating": 7 }
]
}
"" , , .
MongoDB 2.6 $setIntersection $size :
db.users.aggregate([
{ "$match": {
"_id": { "$ne": ObjectId("538181738d6bd23253654690") },
"movies._id": { "$in": [ 1, 2, 3 ] },
"$and": [
{ "movies": { "$not": { "$size": 1 } } }
]
}},
{ "$project": {
"_id": {
"_id": "$_id",
"movies": "$movies"
},
"movies": 1,
}},
{ "$unwind": "$movies" },
{ "$group": {
"_id": "$_id",
"movies": { "$push": "$movies._id" }
}},
{ "$project": {
"movies": {
"$size": {
"$setIntersection": [
[ 1, 2, 3 ],
"$movies"
]
}
}
}},
{ "$match": { "movies": { "$gte": 2 } } }
])
MongoDB, , :
db.users.aggregate([
{ "$match": {
"_id": { "$ne": ObjectId("538181738d6bd23253654690") },
"movies._id": { "$in": [ 1, 2, 3 ] },
"$and": [
{ "movies": { "$not": { "$size": 1 } } }
]
}},
{ "$project": {
"_id": {
"_id": "$_id",
"movies": "$movies"
},
"movies": 1,
"set": { "$cond": [ 1, [ 1, 2, 3 ], 0 ] }
}},
{ "$unwind": "$movies" },
{ "$unwind": "$set" },
{ "$group": {
"_id": "$_id",
"movies": {
"$sum": {
"$cond":[
{ "$eq": [ "$movies._id", "$set" ] },
1,
0
]
}
}
}},
{ "$match": { "movies": { "$gte": 2 } } }
])
, , , , .
$match. , , , , , , . , "", , , "".
, , - , n, , "movies" , , n-1, . $and , 4, :
"$and": [
{ "movies": { "$not": { "$size": 1 } } },
{ "movies": { "$not": { "$size": 2 } } },
{ "movies": { "$not": { "$size": 3 } } }
]
, "" , , , , n. , $size $size . , , $gt, , "". , , .
$project. , MongoDB, . -, , , _id, . "movies" .
, 2.6, , _id . $cond - "" . , MongoDB 2.6 , $literal, $cond.
$unind. - , , _id , ". , pre 2.6 " " , .
$group: MongoDB 2.6 , _id "".
Pre 2.6, " " ( ), , , . true, $cond, 1 0, false. $sum, "".
$project. MongoDB 2.6 , , , "movies" _id, , $setIntersection, . , , $size, , .
$: , , , .
, . 2.6 clunkier - , , , - .
, , n , , , n. n-1 "" "".