node.js - 对于相同的地理数据,MongoDB 在 .save() 和 .findOneAndUpdate() 上的不同行为
问题描述
我正在尝试在 MongoDB 中保存一个简单的地理坐标 [lng, lat] 以便能够使用 GeoSpatial 查询。这是我的架构:
汽车架构:
import mongoose from "mongoose";
const schema = mongoose.Schema({
carId: String,
location: {
type: {
type: String,
enum: ["Point"],
},
coordinates: {
type: [Number],
},
},
});
const Car = mongoose.model("cars", schema);
像这样保存新文档:
const newCar = new Car({
carId: "car1" ,
location: [74.00912, 34.091218]
});
newCar.save();
添加一个带有location
:的新文档{ coordinates: [] }
,但是像这样更新同一个文档:
Car.findOneAndUpdate({carId: "car1}, {location: [74.00912, 34.091218]});
更新文档,location: [ 74.001, 34.0121 ]
地理空间查询正常工作!
为什么相同的值location
在更新时工作正常而在保存新文档时失败?在 MongoDB 中添加和更新地理数据的正确方法是什么。这是预期的行为吗?
解决方案
问题是您定义的架构和您想要存储位置的方式不同。
如果你想像这样存储位置:
location: [74.00912, 34.091218]
你的架构应该是这样的
const schema = new mongoose.Schema({
carId: String,
location: [Number]
});
它在 save 和 findOneAndUpdate 上的工作方式不同,因为当您保存文档时,猫鼬会检查您的文档结构是否与您定义的架构匹配,并忽略与架构不匹配的值和字段。
推荐阅读
- android - 从firebase查询recyclerView的问题
- visual-studio - Visual Studio 代码无法连接到 jupytner 笔记本
- android - 如何在智能手表中部署pure wear os独立app进行测试
- node.js - useEffect 空数组回调不起作用
- r - 如何基于 R 中所有现有列的成对组合创建新列?
- python - 使用 Python 套接字的 PC(Linux)和 RPi 之间的连接被拒绝
- jmeter - JMeter 脚本/执行/监控在 Linux 服务器上运行测试和安装
- javascript - 我如何使用 mocha chai 为这个功能编写测试。我一直在尝试做 expect(notification(app).to.equal(url, messageBody)
- python - Django:BlockingIOError:[Errno 11] 写入无法在没有阻塞的情况下完成
- python-3.x - 如何诊断 configparser 在 pydev 下不起作用