首页 文章

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

提问于
浏览
91

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

  • trk:Schema.Types.Mixed

  • trk:[Schema.Types.Mixed]

  • trk:[{type:[Number],index:"2d"}]

希望你能帮我 ;-)

3 回答

  • 56

    您可以通过以下方式声明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'
          }
    });
    
  • 1

    我和猫鼬有类似的问题:

    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
        }
      ]
    
  • 172

    谢谢你的回复 .

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

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

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

相关问题