首页 > 解决方案 > 对于相同的地理数据,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 中添加和更新地理数据的正确方法是什么。这是预期的行为吗?

标签: node.jsmongodbmongoose

解决方案


问题是您定义的架构和您想要存储位置的方式不同。

如果你想像这样存储位置:

location: [74.00912, 34.091218]

你的架构应该是这样的

const schema = new mongoose.Schema({
  carId: String,
  location: [Number]
});

它在 save 和 findOneAndUpdate 上的工作方式不同,因为当您保存文档时,猫鼬会检查您的文档结构是否与您定义的架构匹配,并忽略与架构不匹配的值和字段。


推荐阅读