2015-02-24 4 views
0

У меня есть очень (по крайней мере для меня) сложный запрос с использованием Mongoose.Сложный запрос с mongoose, включая поддокументы, близкое состояние,

Прежде всего моей схеме:

var ObjectSchema = new Schema({ 
    pickupStartDate: {type: Date, required: true, default: Date}, 
    pickupEndDate: {type: Date, required: true, default: Date}, 

    ... 

    handoverStartDate: {type: Date, required: true, default: Date}, 
    handoverEndDate: {type: Date, required: true, default: Date}, 

    ... 
}); 

С помощью «плагин механизм» мой объект имеет два адреса (так называемые pickupAddress и handoverAddress адрес выглядит так:.

var name = 'address'; 

var obj = {}; 
obj[name] = { 
    street: String, 
    zipCode: String, 
    city: String, 
    state: String, 
    country: String, 
    loc: {type: [Number], index: '2dsphere'} 
}; 
schema.add(obj); 

И другая схема:

var TripSchema = new Schema({ 
    startDate: {type: Date, required: true, default: Date}, 
    endDate: {type: Date, required: true, default: Date}, 
    handoverRadius: {type: Number, required: true} 
}); 

У этого есть address, тоже (с помощью плагина).

Я хочу следующий запрос:

Найти все «объекты», которые «вписываются» в моей поездке. "Fit" означает:

  • handoverStartDate >= trip.startDate
  • handoverEndDate <= trip.endDate
  • `handoverAddress рядом trip.address
  • ...

Я думал, что это будет хороший подход:

ObjectSchema 
    .find() 
    .and([ 
     { handoverStartDate: {$gte: trip.startDate}}, 
     { handoverEndDate:  {$lte: trip.endDate}}, 
     { 'handoverAddress.loc': {$near: { 
      '$maxDistance': 10 * 1000, 
      '$center': { 
       type: 'Point', 
       coordinates: trip.address.loc 
      } 
     }}} 
    ]) 
    .exec(function(err, cdObjects) { 
     console.log(err); 
     console.log(cdObjects); 
    }); 

Но это приводит к следующей ошибке:

{ message: 'Cast to number failed for value "[object Object]" at path "handoverAddress.loc"'.

Я думаю, из-за 'handoverAddress.loc'. Но я не уверен, как указать это, поскольку это должна быть строка (потому что это поддокумент).

+0

вы можете опубликовать пример JSON в виде док на БД? –

ответ

0

Вот как это работает для меня:

ObjectSchema 
    .where('handoverStartDate').gte(trip.startDate) 
    .where('handoverEndDate').lte(trip.endDate) 
    .where('handoverAddress.loc').near({ 
     center: { 
      type: 'Point', 
      coordinates: trip.address.loc 
     }, 
     maxDistance: 10 * 1000 
    }); 
1

Вам не нужны и. попробуйте

ObjectModel.find({ 
    handoverStartDate: {$gte: trip.startDate}, 
    handoverEndDate:  {$lte: trip.endDate}, 
    'handoverAddress.loc': { 
    $near: { 
     $geometry: { 
     type: "Point", 
     coordinates: trip.address.loc 
     }, 
     $maxDistance: 10 * 1000 
    } 
}) 

Убедитесь, что поездка определяются как переменные и STARTDATE, ENDDATE, и адрес всех определенных свойств установки ваших ожиданий.

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