查找具有唯一字段的文档

时间:2016-05-28 14:07:13

标签: mongodb mongoose keystonejs

我有一组带有地理字段(lng / lat)的地址。 现在,我希望获得具有唯一地理lng / lat对的文档,以使用引脚填充Google地图实例。所以我自然不希望多个引脚相互叠加,所以我只需要获得唯一的lng / lat对。

var mongoose = require("mongoose"),
    Schema = mongoose.Schema;

var VenueSchema = new Schema({
    name: String,
    street: String,
    streetNumber: String,
    postCode: String,
    suburb: String,
    state: String,
    geo: Array, // [lng, lat]
});

var Venue = mongoose.model('Venue', VenueSchema);

使用distinct运算符,我可以轻松获得所有唯一的lng / lat。不幸的是,这个查询返回一个lng / lat地理点数组,而不是带有字段的文档。所以我不知道哪个商业名称属于geo point。

keystone.list('Venue').model.find().distinct('geo')
    .exec(function(err, venues){

        if(err){
            throw err;
        }

        console.log(venues); // Array of lat/lng pairs
});

如何构建查询,以便获得包含没有两个地理位置相同的所有字段的实际文档?

1 个答案:

答案 0 :(得分:1)

您可以使用使用$group的聚合管道来提供类似于行为的行为,但具有更大的灵活性:

keystone.list('Venue').model.aggregate([
    // Group the docs by the geo field, taking the first doc for each unique geo
    {$group: {
        _id: '$geo',
        doc: { $first: '$$ROOT' }
    }}
], callback);

$$ROOT是一个系统变量,包含管道阶段的输入文档。因此,这给出了每个唯一geo值的第一个文档。