node.js - 如何使用2d地理索引正确地在Mongoose模式中定义数组中的对象

我目前在为下面的文档创建架构时遇到问题。 来自服务器的响应始终将“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
    }]
    }
}

猫鼬模式:

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”尝试了不同的Schema定义:

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

希望你能帮我 ;-)

niels_h asked 2019-07-29T01:44:16Z
3个解决方案
184 votes

您可以通过以下方式申报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'
      }
});
Kundu answered 2019-07-29T01:44:50Z
58 votes

我和猫鼬有类似的问题:

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

事实上,我在我的架构中使用“type”作为属性名称:

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

要避免这种行为,您必须将参数更改为:

fields: [
    {
      name: String,
      type: {
        type: { type: String }
      },
      registrationEnabled: Boolean,
      checkinEnabled: Boolean
    }
  ]
Pierre Maoui answered 2019-07-29T01:45:29Z
1 votes

谢谢你的回复。

我尝试了第一种方法,但没有改变。 然后,我尝试记录结果。 我只是逐级钻取,直到我终于到达数据显示的位置。

过了一会儿我发现了问题:当我发送响应时,我通过.toString()将其转换为字符串。

我修复了它,现在它的工作非常出色。 对不起,误报了。

niels_h answered 2019-07-29T01:46:15Z
translate from https://stackoverflow.com:/questions/19695058/how-to-define-object-in-array-in-mongoose-schema-correctly-with-2d-geo-index