似乎无法更新导入的数据库中的嵌套值

时间:2018-02-26 08:58:09

标签: node.js mongodb mongoose

我导入mongodb数据库,如下所示:

{
    other values,
    "addresses" : [ 
        {
            "_id" : 
            "createdAt" : 
            "likes" : 
            "type" : 
            "route" : 
            "country" : 
            "administrative_area_level_1" : 
            "administrative_area_level_2" : 
            "locality" : 
            "postal_code" : 
            "street_number" : 
        }
    ],
    other values
}

我想在数据库中添加一个新属性,从而创建这个模式:

const schema = new Schema({
    addresses: [{
        route: String,
        coordinates:[{
            coordsSet: {
                type: Boolean,
                default: false
            },
            lat: String,
            lon: String
        }]
    }],
    name: String,     
});

虽然我可以通过ID找到记录,例如我在调用google API后无法将坐标设置为新记录。我是这样做的:

   baza.findOneAndUpdate({ "addresses._id": response.id }, {$set: {"addresses.coordinates[0].lat": response.lat}}).then((update) =>{
            res.send(update);
        })

但我无法做到这一点。 res.send显示我创建了"coordinates": [],但我无法设置它。

当我想在地址对象之外添加这些新属性时,我没有这个问题,所以我想我没有嵌套一些信息。我做错了什么?

2 个答案:

答案 0 :(得分:1)

试试这个:

baza.findOneAndUpdate({ "addresses._id": response.id }, {$set:{"addresses.coordinates[0].lat": response.lat}}, { new : true }).then((update) =>{
            res.send(update);
        })

第三个参数' {new:true}'表示返回修改后的文件。

答案 1 :(得分:1)

Google API在float中返回lat long,而不是String

并且您已在架构中指定了String,这可能是它未被存储的原因。如果不是指定的格式,mongoose不允许存储任何数据。而且他们也没有错误。

尝试

 baza.findOneAndUpdate({ "addresses._id": response.id }, {$set: {"addresses.coordinates[0].lat": response.lat.toString()}}).then((update) =>{
            res.send(update);
        })

如果这不起作用,您可以发布整个架构吗?使用所有子模式。

编辑: - 您在文档中的坐标键中是否已有第0个元素?如果你没有任何优惠,那么$ set将无法运作。你必须使用

$push : { coordinates : { lat :   response.lat.toString() }}

编辑这最终成功了

因为地址本身就是一个你必须使用$ operator或index

推送的数组
$push : { "addresses.$.coordinates" : { lat : response.lat }}