Я пытаюсь отсортировать вложенный документ по Java. Я не могу найти желаемый результат. Мой набор данных:
[
{
"_id": {
"$oid": "5b91668a0f77e30c11574c88"
},
"driverId": "22",
"busId": "55",
"startTime": {
"$date": 1536255626852
},
"location": [
{
"latitude": 18.5803721,
"longitude": 73.7447051,
"position": 0,
"status": 1,
"time": {
"$date": 1536255628848
}
},
{
"latitude": 18.5803721,
"longitude": 73.7447051,
"position": 1,
"status": 2,
"time": {
"$date": 1536255656122
}
},
{
"latitude": 18.5803721,
"longitude": 73.7447051,
"position": 1,
"status": 2,
"time": {
"$date": 1536255656167
}
}
]
},
{
"_id": {
"$oid": "5b8c2cc70f77e322617c1ba1"
},
"driverId": "22",
"busId": "55",
"startTime": {
"$date": 1535913159533
},
"location": [
{
"latitude": 18.5804663,
"longitude": 73.7447209,
"position": 0,
"status": 1,
"time": {
"$date": 1535913160226
}
},
{
"latitude": 18.5804663,
"longitude": 73.7447209,
"position": 1,
"status": 2,
"time": {
"$date": 1535913186460
}
},
{
"latitude": 18.5804663,
"longitude": 73.7447209,
"position": 1,
"status": 2,
"time": {
"$date": 1535913187603
}
}
]
}
]
и код, который я написал:
AggregateIterable<Document> findIterable = tripsCollection.aggregate(Arrays.asList(
new Document("$match", new Document("busId", busId)),
new Document("$sort", new Document("startTime", -1)),
new Document("$sort", new Document("location.position", -1))));
Когда я сортирую документ по _Id или startTime, вывод приходит соответственно. Но когда я пытаюсь отсортировать вложенный документ, набор результатов не меняется.
Я попробовал и другой вариант:
Bson bsonFilterBus = Filters.eq("busId", busId);
Bson sortByDate = descending("startTime");
Bson sortByPosition = descending("location.position");
FindIterable<Document> findIterable = tripsCollection.find(bsonFilterBus).sort(sortByDate).sort(sortByPosition);
Но результаты были такими же. т.е. не отсортировано по местоположению. позиции
Я работаю с MongoDb 4.0. Где-то я читал, Mongo DB не предоставляет никакого метода для сортировки вложенных документов. Пожалуйста, помогите мне.
Вы должны $unwind
вложить документы, затем $sort
по полю местоположения и $group
, чтобы получить обратно массив местоположений.
Что-то вроде
AggregateIterable<Document> findIterable = tripsCollection.aggregate(
Arrays.asList(
new Document("$match", new Document("busId", busId)),
new Document("$unwind", "$location"),
new Document("$sort", new Document("location.position", -1)),
new Document("$group",
new Document("_id", "$_id")
.append("driverId", new Document("$first","$driverId"))
.append("busId", new Document("$first","$busId"))
.append("startTime", new Document("$first","$startTime"))
.append("location", new Document("$push","$location"))
),
new Document("$sort", new Document("startTime", -1))
)
);