Wie definiert man ein Objekt in einem Array im Mongoose Schema korrekt mit einem 2d geo index

Ich habe derzeit Probleme bei der Erstellung eines Schemas für das unten stehende Dokument. Die Antwort vom Server gibt die "trk" Feldwerte immer als [Object] zurück. Irgendwie habe ich keine Ahnung, wie das funktionieren soll, da ich zumindest alle Ansätze ausprobiert habe, die für mich Sinn machten ;-)

Falls das hilft, meine Mongoose-Version ist 3.6.20 und MongoDB 2.4.7 Und bevor ich es vergesse, es wäre schön, wenn man es auch als Index (2d) einstellen könnte

Ursprüngliche Daten:

{
    "_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 Schema:

var TrackSchema = Schema({
            _id: Schema.ObjectId,
            gpx: {
                metadata: {
                    desc: String,
                    country: String,
                    isActive: Boolean
                },
                trk: [{lat:Number, lng:Number}]
            }
        }, { collection: "tracks" });

Die Antwort der Registerkarte Netzwerk in Chrome sieht immer so aus (nur der trk-Teil ist falsch):

{ trk: 
      [ [Object],
        [Object],
        [Object],
        [Object],
        [Object],
        [Object],

Ich habe bereits verschiedene Schemadefinitionen für "trk" ausprobiert:

  1. trk: Schema.Types.Mixed
  2. trk: [Schema.Types.Mixed]
  3. trk:[ { type:[Number], index: "2d" }]

Hoffe ihr könnt mir helfen ;-)

Lösung

Sie können trk auf die folgenden Arten deklarieren: - entweder

trk : [{
    lat : String,
    lng : String
     }]

oder

trk : { type : Array , "default" : [] }

Im zweiten Fall wird beim Einfügen das Objekt erstellt und in das Array geschoben, wie

db.update({'Searching criteria goes here'},
{
 $push : {
    trk :  {
             "lat": 50.3293714,
             "lng": 6.9389939
           } //inserted data is the object to be inserted 
  }
});

oder Sie können das Array des Objekts durch

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'
      }
});
Kommentare (8)

Ich hatte ein ähnliches Problem mit mongoose:

fields: 
    [ '[object Object]',
     '[object Object]',
     '[object Object]',
     '[object Object]' ] }

In der Tat habe ich "type" als Eigenschaftsname in meinem Schema verwendet:

fields: [
    {
      name: String,
      type: {
        type: String
      },
      registrationEnabled: Boolean,
      checkinEnabled: Boolean
    }
  ]

Um dieses Verhalten zu vermeiden, müssen Sie den Parameter in:

fields: [
    {
      name: String,
      type: {
        type: { type: String }
      },
      registrationEnabled: Boolean,
      checkinEnabled: Boolean
    }
  ]
Kommentare (4)

Vielen Dank für die Antworten.

Ich habe den ersten Ansatz versucht, aber es hat sich nichts geändert. Dann habe ich versucht, die Ergebnisse zu protokollieren. Ich habe einfach Ebene für Ebene nach unten gebohrt, bis ich schließlich zu dem Punkt kam, an dem die Daten angezeigt wurden.

Nach einer Weile fand ich das Problem: Als ich die Antwort sendete, konvertierte ich sie in eine Zeichenkette mittels .toString().

Ich habe das behoben und jetzt funktioniert es hervorragend. Entschuldigung für den Fehlalarm.

Kommentare (0)