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

Posted

技术标签:

【中文标题】似乎无法更新导入数据库中的嵌套值【英文标题】:Can't seem to update nested values in imported database 【发布时间】:2018-08-05 16:23:40 【问题描述】:

我将一个数据库导入 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": [],但是我无法设置它。

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

【问题讨论】:

$set 用引号括起来,就像"$set"。请看this问题 行为没有任何变化 您可以尝试使用findByIdAndUpdate 看看行为是否有任何不同吗? 刚刚尝试过,行为也没有变化。我只是不明白为什么它在地址之外而不在地址内部起作用 你能提供 other_values 在 Mongo 中的表现吗?所以只需复制结构并省略任何敏感的值 【参考方案1】:

试试这个:

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

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

【讨论】:

我返回修改后的文档没有问题,因为它没有被修改,这就是问题。【参考方案2】:

Google API 以浮点形式返回 lat long,而不是字符串

并且您在架构中指定了字符串,这可能是它没有被存储的原因。如果数据不是指定格式,猫鼬将不允许存储任何数据。他们也不会犯错。

试试

 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() 

编辑终于成功了

因为地址本身是一个数组,你必须使用 $ 运算符或索引来推送

$push :  "addresses.$.coordinates" :  lat : response.lat 

【讨论】:

我试过了,行为没有改变。当我在地址对象之外进行设置时,猫鼬也没有将纬度设置为字符串的问题。我将尝试上面提出的另一种解决方案,如果它不起作用,则发布整个架构,但这几乎就是您已经看到的。除非我必须将所有属性复制到架构才能使其工作 我之前没有任何元素,所以我使用了$push。带引号和不带引号都试过了,可悲的是,它仍然无法正常工作。我将在 1 分钟内发布我的整个架构 让它工作。我使用了$set: addresses: coordinates: lat:response.lat ,所以毕竟用 set 切换了 push 嗯,这很奇怪,但不管对你有用。虽然这会设置整个数组中每个对象的纬度。 嗯,你说得对,它实际上覆盖了地址的其余部分。所以它毕竟仍然不起作用,不知道为什么此时 push 不起作用

以上是关于似乎无法更新导入数据库中的嵌套值的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio 无法解析 dart 文件中的嵌套导入

无法在数据准备中的列中转义逗号

MySQL数据库导入成功但不起作用

Excel Power Query导入MySQL数据

通过宏导入数据后保存excel文件的问题

如何导入Joomla!来自自定义文件中的JFactory