Đâ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
refstrong đó "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
namelà một mảng phần tử đơn vàrefstrở 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.