2016-05-28 2 views
0

У меня есть коллекция адресов с гео-полем (lng/lat). Теперь я хочу получить документы с уникальными парами geo 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); 

Используя отдельный оператор, я могу легко получить все уникальные lng/lat. К сожалению, этот запрос возвращает массив lng/lat geo points, а не документы с полями. Поэтому я понятия не имею, какое название компании принадлежит той точке гео.

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

     if(err){ 
      throw err; 
     } 

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

Как построить запрос таким образом я получаю реальные документы со всеми полями, где нет двух местах гео не являются одинаковыми?

ответ

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.

+0

спасибо @JohnnyHK. Отлично работает. Посмотрел документацию для переменной $$ ROOT. Не очень хорошо документировано. https://docs.mongodb.com/manual/reference/operator/aggregation/group/ – ChrisRich

Смежные вопросы