查找具有唯一字段的文档

Find documents with unique field

我有一组带有地理字段的地址 (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。不幸的是,此查询 returns 一个 lng/lat 地理点数组,而不是包含字段的文档。所以我不知道哪个商家名称属于哪个地理点。

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

        if(err){
            throw err;
        }

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

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

您可以使用聚合管道,该管道使用 $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 值的第一个文档。