Mempertimbangkan "lekukan" yang saya gunakan dalam daftar, ini mungkin terlihat lebih panjang daripada yang Anda lakukan, tetapi sebenarnya tidak.
Ini adalah contoh lain yang sangat bagus untuk menggunakan $map
seperti yang tersedia untuk MongoDB 2.6 dan yang lebih baru. Masih ada beberapa penggunaan $unwind
, tetapi array yang "dibatalkan" sebenarnya hanya memiliki satu elemen di dalamnya. Jadi, maafkan "Highlander" saya
referensi yang tidak bisa saya tolak :)
db.users.aggregate([
// Match your document or documents
{ "$match": {
"commentUpvotes.id": 12
}},
// Get the one "up-votes" entry that matches
{ "$project": {
"posts": 1,
"comments": 1,
"commentUpVotes": {
"$setDifference": [
{
"$map": {
"input": "$commentUpvotes",
"as": "el",
"in": {
"$cond": [
{ "$eq": [ "$$el.id", 12 ] },
"$$el",
false
]
}
}
},
[false]
]
}
}},
// There is only one!
{ "$unwind": "$commentUpVotes" },
// Get the one comments entry that matches
{ "$project": {
"posts": 1,
"comments": {
"$setDifference": [
{
"$map": {
"input": "$comments",
"as": "el",
"in": {
"$cond": [
{
"$eq": [
{ "$substr": [ "$$el.id", 0, 4 ] },
"$commentUpVotes.commentId"
]
},
"$$el",
false
]
}
}
},
[false]
]
},
"commentUpVotes": 1
}},
// And there is only one!
{ "$unwind": "$comments" },
// Get the one post that matches
{ "$project": {
"posts": {
"$setDifference": [
{
"$map": {
"input": "$posts",
"as": "el",
"in": {
"$cond": [
{
"$eq": [
"$$el.id",
"$comments.postId"
]
},
"$$el",
false
]
}
}
},
[false]
]
},
"comments": 1,
"commentUpVotes": 1
}},
// Optionally group back to arrays. There can be only one!
{ "$group": {
"_id": "$_id",
"posts": { "$first": "$posts" },
"comments": { "$push": "$comments" },
"commentUpVotes": { "$push": "$commentUpVotes" }
}}
])
Jadi hasil akhirnya adalah:
{
"_id" : ObjectId("539065d3cd0f2aac5f55778e"),
"posts" : [
{
"title" : "post1",
"id" : "123"
}
],
"comments" : [
{
"id" : 1910,
"postId" : "123",
"title" : "comment1",
"comment" : "some comment",
"user" : "user13"
}
],
"commentUpVotes" : [
{
"id" : 12,
"commentId" : "1910",
"upvotedBy" : "user91"
}
]
}
Saya tahu Anda meminta "tidak ada perubahan skema", tetapi sebenarnya bukan perubahan skema untuk mengatakan itu adalah ide yang baik untuk menyimpan id
Anda nilai di sini dari jenis yang konsisten. Saat ini Anda sedang mencampur bilangan bulat dan string dalam proses ini ( saya harap ini hanya sebuah contoh ) yang bukan ide yang baik.
Jadi ada beberapa "casting terbatas" yang sebenarnya tersedia digunakan di sini menggunakan $substr
Bagaimanapun, penggunaan yang cukup keren untuk $map