Tôi có một "lớp" tài liệu như:Aggregation Khung MongoDB của: Dự án chỉ phù hợp với các yếu tố của một mảng
{
className: "AAA",
students: [
{name:"An", age:"13"},
{name:"Hao", age:"13"},
{name:"John", age:"14"},
{name:"Hung", age:"12"}
]
}
Và tôi muốn để có được những sinh viên có tên là "An", chỉ nhận được phù hợp với yếu tố trong mảng "sinh viên". Tôi có thể làm điều đó với chức năng find() như:
>db.class.find({"students.name":"An"}, {"students.$":true})
{
"_id" : ObjectId("548b01815a06570735b946c1"),
"students" : [
{
"name" : "An",
"age" : "13"
}
]}
Đó là tốt, nhưng khi tôi làm như vậy với tập hợp như sau, nó nhận được lỗi:
db.class.aggregate([
{$match:{"students.name":'An'}},
{$project:{"students.$":true}}
])
Lỗi là:
uncaught exception: aggregate failed: {
"errmsg" : "exception: FieldPath field names may not start with '$'.",
"code" : 16410,
"ok" : 0
}
Tại sao? Tôi không thể sử dụng "$" cho mảng trong toán tử $ project của aggregate() trong khi có thể sử dụng mảng này trong toán tử dự án của hàm find().
Tôi đã thử nó trước đây, nhưng tôi nghĩ rằng giải pháp này là không tốt. Khi chúng tôi sử dụng $ thư giãn, tài liệu sẽ được sao chép rất nhiều thời gian (như số phần tử trong mảng), có thể ảnh hưởng đến hiệu suất, tôi muốn dự án thay vì thư giãn nó. – Deka
Điều đó có ý nghĩa. Những gì bạn có thể làm sau đó là chuyển đổi thứ tự của thư giãn và kết hợp trong các đường ống để bạn lọc các tài liệu của bạn đầu tiên và sau đó thư giãn để chiếu dễ dàng hơn. Xem câu trả lời được cập nhật. – atyagi
Nó sẽ là giải pháp chấp nhận được, tôi không biết tại sao "Tôi không thể dùng" $ "cho mảng trong $ project operator của aggregate() trong khi có thể dùng cái này trong toán tử dự án find()" – Deka