У меня очень (по крайней мере для меня) сложный запрос с использованием 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 (снова с использованием механизма плагинов).

Мне нужен следующий запрос:

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

  • 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
mosquito87 24 Фев 2015 в 18:45

2 ответа

Лучший ответ

У меня это сработало так:

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
    });
0
mosquito87 25 Фев 2015 в 15:42

Вам не нужны и. пытаться

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

Убедитесь, что trip определен как переменная и что startDate, endDate и address - все определенные свойства, соответствующие вашим ожиданиям.

1
mrBorna 24 Фев 2015 в 17:56