Как правильно определить объект в массиве в схеме 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().

Я исправил это, и теперь он работает блестяще. Извините за ложную тревогу.