在保存到Mongo时,Mongoose的纬度和经度验证无法工作?

3
以下是我的位置集合模式:
var LocationSchema = new Schema({
    street : {type: String, required: true},
    area : {type: String, required: true},
    city : {type: String, required: true},
    state : {type: String, required: true},
    zip : {type: String, required: true},
    country : {type: String, default: 'IN'},
    pointers:{type: [], index: '2dsphere'}
});

在使用mongoose保存数据到mongo时,指针被存储为字符串而不是数字。得到以下响应:
"street": "rani sati marg",
"area": "malad east",
"city": "mumbai",
"state": "maharashtra",
"zip": "400097",
"pointers": [
    "72.857452,19.857452"
],
"country": "IN"

我希望能够将指针值转换为数字格式,如:[72.857452,19.857452]。

1
你实际上并没有要求它。"pointers": { "type": [Number], "index": "2dphere" } 实际上声明了数组中的内容必须是数字,并且当发送一个像你所做的“字符串”数组时,将自动转换为数字。 - Blakes Seven
在验证过程中,当尝试进行数组转换时出现了“无法将值转换为数组”的错误。 - Ashesh Khatri
1个回答

0

错过了源数据中包含逗号的字符串。

因此,在模式中仍需要一个数值“类型”:

"pointers": { "type": [Number], "index": "2dphere" }

但是您还希望有一个“setter”函数来为您执行转换:

LocationSchema.path("pointers").set(function(value) {
    if ( typeof(value[0]) == "string" && value.length == 1 ) {
        return value[0].split(",");
    } else {
        return value;
    }
});    

就是这样。数组中的 Number 类型将自动将 "String" 转换为数字,因此无需使用 parseFloat 或任何其他操作,因为已经处理过了。

在 "setter" 中,你真正需要做的就是弄清楚:

“如果我得到的数组包含一个字符串,并且只有一个元素,则我假定它以逗号分隔并将该字符串拆分成数组。”

你可能希望进行比这更严格的逻辑判断,但这是实现对传递给 "setter" 的数据进行转换的基本方法。

这就是所得到的结果:

pointers: [ 72.857452, 19.857452 ]

就像它应该的那样。


使用上述解决方案出现了“对值"72.857452,19.857452"进行数组转换失败”的错误。 - Ashesh Khatri
@AsheshKhatri 如果你实际上使用了答案中所示的.set(),那么你就没有错。因此,如果你实际上提交了像这样的数据 "pointers": [ "72.857452,19.857452"],并且在一个数组中有一个单独的字符串,就像你的问题所问的那样,那么提供的“setter”的函数将把该字符串拆分成两个元素的数组,并相应地设置值。如果你只是提交了 "pointers": "72.857452,19.857452",那么你不需要查看value0索引,而是直接在value上测试和发出split(),即 return value.split(",") - Blakes Seven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接