【问题标题】: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 中的表现吗?所以只需复制结构并省略任何敏感的值

标签: node.js mongodb mongoose


【解决方案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 不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多