Как правильно определить объект в массиве в схеме Mongoose с 2d геоинформацией
У меня возникают проблемы при создании схемы для документа ниже. Ответ от сервера всегда возвращает значения поля trk как [Object]. Каким-то образом я понятия не имею, как это должно работать, поскольку я пытался, по крайней мере, все подходы, которые имели смысл для меня; -)
Если это поможет, моя версия Mongoose - 3.6.20, а MongoDB 2.4.7
И прежде чем я забуду, было бы неплохо также установить его как Index (2d)
Исходные данные:
{
"_id": ObjectId("51ec4ac3eb7f7c701b000000"),
"gpx": {
"metadata": {
"desc": "Nürburgring VLN-Variante",
"country": "de",
"isActive": true
},
"trk": [
{
"lat": 50.3299594,
"lng": 6.9393006
},
{
"lat": 50.3295046,
"lng": 6.9390688
},
{
"lat": 50.3293714,
"lng": 6.9389939
},
{
"lat": 50.3293284,
"lng": 6.9389634
}]
}
}
Схема Mongoose:
var TrackSchema = Schema({
_id: Schema.ObjectId,
gpx: {
metadata: {
desc: String,
country: String,
isActive: Boolean
},
trk: [{lat:Number, lng:Number}]
}
}, { collection: "tracks" });
Отклик на вкладке "Сеть" в Chrome всегда выглядит так (что только неверная часть trk):
{ trk:
[ [Object],
[Object],
[Object],
[Object],
[Object],
[Object],
Я уже пробовал разные определения схемы для "trk":
- trk: Schema.Types.Mixed
- trk: [Schema.Types.Mixed]
- trk: [{type: [Number], index: "2d" }]
Надеюсь, ты сможешь мне помочь, -)
Ответы
Ответ 1
Вы можете объявить trk следующими способами:
либо
trk : [{
lat : String,
lng : String
}]
или
trk : { type : Array , "default" : [] }
Во втором случае при вставке сделайте объект и вставьте его в массив, например
db.update({'Searching criteria goes here'},
{
$push : {
trk : {
"lat": 50.3293714,
"lng": 6.9389939
} //inserted data is the object to be inserted
}
});
или вы можете установить массив объектов
db.update ({'seraching criteria goes here ' },
{
$set : {
trk : [ {
"lat": 50.3293714,
"lng": 6.9389939
},
{
"lat": 50.3293284,
"lng": 6.9389634
}
]//'inserted Array containing the list of object'
}
});
Ответ 2
У меня была аналогичная проблема с мангуста:
fields:
[ '[object Object]',
'[object Object]',
'[object Object]',
'[object Object]' ] }
Фактически, я использовал "тип" в качестве имени свойства в моей схеме:
fields: [
{
name: String,
type: {
type: String
},
registrationEnabled: Boolean,
checkinEnabled: Boolean
}
]
Чтобы избежать такого поведения, вам необходимо изменить параметр:
fields: [
{
name: String,
type: {
type: { type: String }
},
registrationEnabled: Boolean,
checkinEnabled: Boolean
}
]
Ответ 3
Спасибо за ответы.
Я пробовал первый подход, но ничего не изменилось. Затем я попытался зарегистрировать результаты. Я только что просверлил уровень по уровню, пока не добрался до того, где были отображены данные.
Через некоторое время я обнаружил проблему: когда я отправлял ответ, я преобразовал его в строку через .toString()
.
Я исправил это, и теперь он работает блестяще. Извините за ложную тревогу.