Berikut adalah contoh menggunakan Kerangka Agregasi di MongoDB 2.4.9 yang menurut saya mencapai hasil yang Anda inginkan:
db.books.aggregate(
// Unwind the refs array
{ $unwind: "$refs" },
// Sort by refs.default descending so "true" values will be first, nulls last
{ $sort: {
"refs.default" : -1
}},
// Group and take the first ref; should either be "default:true" or first element
{ $group: {
_id: "$_id",
name: { $addToSet: "$name" },
refs: { $first: "$refs" }
}},
// (optional) Sort by name to match the example output
{ $sort: {
name: 1,
}},
// (optional) Clean up output
{ $project: {
_id: 0,
name: 1,
refs: 1
}}
)
Contoh hasil:
{
"result" : [
{
"name" : [
"Book1"
],
"refs" : {
"oid" : "object5",
"default" : true
}
},
{
"name" : [
"Book2"
],
"refs" : {
"oid" : "object5",
"default" : true
}
},
{
"name" : [
"Book3"
],
"refs" : {
"oid" : "object4"
}
},
{
"name" : [
"Book4"
],
"refs" : {
"oid" : "object4",
"default" : true
}
}
],
"ok" : 1
}
Catatan:
-
Ini membuat asumsi tentang perilaku urutan pengurutan untuk
refs
di mana "default:true" tidak ada. Pada pengujian singkat, urutan asli tampaknya dipertahankan, sehingga elemen "pertama" dari larik seperti yang diharapkan. -
Karena operator agregasi yang digunakan, output
name
adalah larik elemen tunggal, danrefs
menjadi objek yang disematkan. Daripada memanipulasi lebih jauh dalam Kerangka Agregasi, Anda bisa merujuk kolom yang benar dalam kode aplikasi Anda.