我导入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": []
,但我无法设置它。
当我想在地址对象之外添加这些新属性时,我没有这个问题,所以我想我没有嵌套一些信息。我做错了什么?
答案 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 }}