Mongooseのスキーマで配列のオブジェクトを2次元のジオインデックスで正しく定義する方法

現在、以下のドキュメントのスキーマを作成するのに困っています。サーバーからのレスポンスは、常に"trk"フィールドの値を[Object]として返します。少なくとも私にとって意味のあるアプローチはすべて試したのですが、なぜかこれがどのように機能すべきなのかわかりません ;-)

参考までに、私のMongooseのバージョンは3.6.20、MongoDBは2.4.7です。 それから、忘れないうちに言っておきますが、インデックス(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
    }]
    }
}

マングースのスキーマです。

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

ChromeのNetworkタブからのレスポンスは常に以下のようになります(trkの部分だけが間違っています)。

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

すでに、"trk"のための異なるスキーマ定義を試しました。

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

ご参考になれば幸いです。)

ソリューション

以下の方法でtrkを宣言することができます。 いずれか

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

または

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

2番目のケースでは、挿入時にオブジェクトを作成し、次のようにそれを配列に押し込みます。

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

mongooseでも同じようなことがありました。

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

実際、私のスキーマでは、プロパティ名として "type" を使用していました。

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

このような動作を避けるためには、パラメータを.NETに変更する必要があります。

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

お返事ありがとうございました。

最初の方法を試してみましたが、何も変わりませんでした。次に、結果を記録しようとしました。私は、データが表示される場所にたどり着くまで、レベルごとに掘り下げていきました。

レスポンスを送信する際に、.toString()で文字列に変換していたのです。

これを修正したところ、見事に動作するようになりました。誤報ですみません。

解説 (0)