Chưa có tính năng giúp bạn đạt được điều này. Tuy nhiên, sẽ có một toán tử tổng hợp mới cung cấp một phần tử mảng cho một chỉ mục nhất định. Biểu thức mới được gọi là $arrayElemAt
Sử dụng toán tử tổng hợp mới có sẵn cho các phiên bản MongoDB 3.2.X
và lớn hơn, nó trả về một phần tử mảng cho một chỉ mục nhất định. Biểu thức mới được gọi là $arrayElemAt
. Nó nhận hai đối số, một mảng và một chỉ mục và trả về phần tử tại chỉ số đã cho trong mảng. Các chỉ số phủ định được chấp nhận là các chỉ mục từ phía sau của mảng. Nếu chỉ mục nằm ngoài giới hạn, nó sẽ trả về giá trị bị thiếu, có nghĩa là trường sẽ không tồn tại trong đầu ra:
var pipeline = [
{ $match : {"geo" : {$ne: null}}},
{
$project: {
_id: "$id_str",
lat: { $arrayElemAt: ['$geo.coordinates', 0] },
lon: { $arrayElemAt: ['$geo.coordinates', 1] }
}
}
];
Như một giải pháp thay thế hiện tại (giả sử mảng tọa độ sẽ luôn có hai phần tử tại bất kỳ thời điểm nào), bạn có thể thử đường dẫn tổng hợp sau đây sẽ tận dụng lợi thế của $first
và $last
toán tử bộ tích lũy nhóm để lấy các phần tử sau $sort
:
var pipeline = [
{$match : {"geo" : {$ne: null}}},
{ "$unwind": "$geo.coordinates" },
{ "$sort": {"geo.coordinates": 1} } ,
{
"$group": {
"_id": "$_id",
"lat": { "$first": "$geo.coordinates" },
"lon": { "$last": "$geo.coordinates" }
}
}
];