Đây là một ví dụ sử dụng Khung tổng hợp trong MongoDB 2.4.9 mà tôi nghĩ sẽ đạt được kết quả như bạn mong muốn:
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
}}
)
Kết quả mẫu:
{
"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
}
Ghi chú:
-
Điều này tạo ra một giả định về hành vi thứ tự sắp xếp cho
refs
trong đó "default:true" bị thiếu. Trong quá trình kiểm tra ngắn gọn, thứ tự ban đầu dường như được giữ nguyên, vì vậy phần tử "đầu tiên" của mảng như mong đợi. -
Do các toán tử tổng hợp được sử dụng, đầu ra
name
là một mảng phần tử đơn vàrefs
trở thành một đối tượng nhúng. Thay vì thao tác thêm trong Khung tổng hợp, bạn chỉ có thể tham chiếu các trường chính xác trong mã ứng dụng của mình.