基于索引的嵌套JSON对象

时间:2017-11-20 17:29:46

标签: json mongodb

我是JSON和MongoDB Schema的新手,我正在寻找解决问题的方法。我想将userId存储为索引,然后将其位置坐标作为该索引对应的用户位置(使用geoJSON她)的值(“userId”)。

这是我的MongoDB架构。

const locationSchema = new Schema({
    userId:
        {
            geometry: geoSchema
        }
});

此外,

const geoSchema = new Schema({
    type: {
        type: String,
        default: 'Point'
    },
    coordinates: {
        type: [Number],
        index: '2dsphere'
    },
    date: { 
        type:Date, 
        default:Date.now 
    }
});

&安培;这是我的帖子请求

{
    "userId":
            {
               "geometry":{ 
                "coordinates": [
                    1.9,
                    2
                ],
                "type": "Point"
            }
        }
}

注意:如果我将“userId”更改为实际的userId,即12345等,它将无效。

问题是,我无法设置userId(父对象)值。我在使用Firebase API时做了这件事,但在这里我无法弄清楚如何做到这一点。 我通过这种方法看到的优点是,我可以一次又一次地存储用户的位置,对应于用户的id,而不是每次都创建将其存储为新对象。 希望我在这里有意义。

1 个答案:

答案 0 :(得分:0)

修改

你想在几何对象上有一个数组,模式应该是:

{
    userId: String,
    geometry: [ geoSchema ]
}

然后,您可以将项目“推送”到现有对象https://docs.mongodb.com/manual/reference/operator/update/push/index.html

你的mongo查询看起来像:

db.collection.update(
   { user: "12345" },
   { $push: {
       "geometry":{ 
            "coordinates": [
                1.9,
                2
            ],
            "type": "Point"
        } 
   }
)

原始回复

您的架构中需要userId的字段。 例如,它可以是:

{
    userId: String
    geometry: geoSchema
}

然后你的POST请求看起来像:

{
    "userId": "12345"
    {
       "geometry":{ 
        "coordinates": [
            1.9,
            2
        ],
        "type": "Point"
    }
}