Геопространственная геопространственная информация $near $unwind mongodb

У меня есть документ образовательного учреждения, который выглядит так:

{ name: ..., addresses: [{state: ..., locs: []}, ...], courses: [...] }

Где locs, где мои геопространственные точки.

Чтобы выполнить команду $near, мне нужно $unwind адресов, потому что у меня может быть образовательное учреждение во многих точках.

Мой текущий метод выглядит так:

public BasicDBList findByCoordinates(double latitude, double longitude){

    BasicDBObject cmdBody = new BasicDBObject("aggregate", "EducationalInstitution");

    List<BasicDBObject> pipeline = new ArrayList<BasicDBObject>();

    BasicDBObject projectParams = new BasicDBObject();
    projectParams.put("name", 1);
    projectParams.put("addresses.state", 1);
    projectParams.put("addresses.locs", 1);
    projectParams.put("courses", 1);

    BasicDBObject geoParams = new BasicDBObject();
    geoParams.put("$near", new double[] { latitude, longitude });
    geoParams.put("$maxDistance", 50/111.12);

    pipeline.add(new BasicDBObject("$project", projectParams));
    pipeline.add(new BasicDBObject("$unwind", "$addresses"));

    cmdBody.put("pipeline", pipeline);
    cmdBody.put("$addresses.locs", geoParams);

    return (BasicDBList) getDatastore().getDB().command(cmdBody).get("result");
}

Пробовал ближний метод от morphia

createQuery().field("addresses.locs").near(latitude, longitude, 50/111.12);

Однако он возвращает все адреса, которые я хочу раскрутить, мне просто нужен адрес, который находится рядом с какой-то точкой


person arthurfnsc    schedule 26.08.2013    source источник


Ответы (1)


Я нашел решение. Сначала я попытался использовать $match и $near, но безуспешно.

Затем я прочитал об агрегации $geoNear и попытался поставить последний параметр моего пайплайна, однако, согласно странице MongoDB: «Вы можете использовать $geoNear только в качестве первого этапа пайплайна».

Я сомневался в том, что $unwind мне нужен, но я нашел параметр, который помогает мне в локализации массива.

Мой шелл-код:

db.EducationalInstitution.aggregate( {$geoNear: {near: [-15.795758,-47.892312], maxDistance: 50/111.12, distanceField: "addresses.calculated", includeLocs: "addresses.locs", niqueDocs: true}}, {$project: {"name": 1, "addresses.state": 1, "addresses.locs": 1}} );

Мой Java-код:

public BasicDBList findByCoordinates(double longitude, double latitude){

    BasicDBObject cmdBody = new BasicDBObject("aggregate", "EducationalInstitution");

    List<BasicDBObject> pipeline = new ArrayList<BasicDBObject>();

    BasicDBObject geoNearParams = new BasicDBObject();
    geoNearParams.put("near", new double[] {longitude, latitude,});
    geoNearParams.put("maxDistance", 50/111.12);
    geoNearParams.put("distanceField", "addresses.calculated");
    geoNearParams.put("includeLocs", "addresses.locs");
    geoNearParams.put("niqueDocs", true);

    BasicDBObject projectParams = new BasicDBObject();
    projectParams.put("name", 1);
    projectParams.put("addresses.state", 1);
    projectParams.put("addresses.locs", 1);
    projectParams.put("courses", 1);

    pipeline.add(new BasicDBObject("$geoNear", geoNearParams));
    pipeline.add(new BasicDBObject("$project", projectParams));

    cmdBody.put("pipeline", pipeline); 

    if( !getDatastore().getDB().command(cmdBody).ok() ){

        throw new MongoException(getDatastore().getDB().command(cmdBody).getErrorMessage());
    }

    return (BasicDBList) getDatastore().getDB().command(cmdBody).get("result");
}

Спасибо

person arthurfnsc    schedule 28.08.2013