сортировать вложенный документ в mogodb4.0 драйвером java - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь отсортировать поддокумент по 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 не предоставляет никакого способа сортировки вложенных документов. Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 09 сентября 2018

Вам необходимо $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))
   )
);
...