Поле расстояния в geoNear весной-данные-mongodb

#mongodb #spring-data-mongodb

#mongodb #весна-данные-mongodb

Вопрос:

Я использую spring-data-mongodb.

  1. могу ли я запустить запрос geoNear с использованием агрегации.
  2. Могу ли я указать distanceField в запросе geoNear, как мы делаем в mongodb.

Ниже приведен пример запроса mongodb :-

 ([
{
    $geoNear: {
        near: [
            28.45,
            77.34
        ],
        distanceField: "distance",
        maxDistance: 20,
        num: 5,
        query: {
            $or: [
                {
                    cuisines: {
                        '$in': [
                            'Mughlai',
                            'NorthIndian'
                        ]
                    }
                }
            ]
        }
    }
},
{
$unwind: '$ProducerTimeSlots'
}
])
  

Ответ №1:

Вам необходимо расширить возможности агрегирования, класс GeoNearOperations не имеет переменной distanceField.

 public class GeoNearOperationExt implements AggregationOperation {

private NearQuery nearQuery;

private String distanceField = "distance";

public GeoNearOperationExt(NearQuery nearQuery) {
    this.nearQuery = nearQuery;
}

/**
 * Default is distance
 * @return
 */
public String getDistanceField() {
    return distanceField;
}

/**
 * Set distanceField value Default is distance
 * @param distanceField
 */
public void setDistanceField(String distanceField) {
    this.distanceField = distanceField;
}



@Override
public DBObject toDBObject(AggregationOperationContext context) {
    DBObject dbObject = context.getMappedObject(nearQuery.toDBObject());
    dbObject.put("distanceField", distanceField);
    return new BasicDBObject("$geoNear", dbObject);
}
}
  

Чтобы использовать его в агрегации, просто включите его в массив агрегатных операций, т.Е. Параметров, передаваемых агрегатной функции.