似乎无法更新导入数据库中的嵌套值
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 不起作用以上是关于似乎无法更新导入数据库中的嵌套值的主要内容,如果未能解决你的问题,请参考以下文章