У меня очень (по крайней мере для меня) сложный запрос с использованием 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'
. Но я не уверен, как это указать, поскольку это должна быть строка (потому что это вложенный документ).
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
});
Вам не нужны и. пытаться
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 - все определенные свойства, соответствующие вашим ожиданиям.
Похожие вопросы
Новые вопросы
node.js
Node.js — это основанная на событиях, неблокирующая, асинхронная среда выполнения ввода-вывода, использующая движок Google V8 JavaScript и библиотеку libuv. Он используется для разработки приложений, которые интенсивно используют возможность запуска JavaScript как на стороне клиента, так и на стороне сервера и, следовательно, выигрывают от возможности повторного использования кода и отсутствия переключения контекста.