将 $concat 与 $project 一起使用会给出错误:'MongoError: $concat 只支持字符串,而不支持双精度'?
Posted
技术标签:
【中文标题】将 $concat 与 $project 一起使用会给出错误:\'MongoError: $concat 只支持字符串,而不支持双精度\'?【英文标题】:Using $concat with $project is giving error : 'MongoError: $concat only supports strings, not double'?将 $concat 与 $project 一起使用会给出错误:'MongoError: $concat 只支持字符串,而不支持双精度'? 【发布时间】:2018-08-24 13:32:06 【问题描述】:我有一个猫鼬模型,其中一些字段类似于:
var AssociateSchema = new Schema(
personalInformation:
familyName: type: String ,
givenName: type: String
)
我想对 familyName 和 givenName 的串联执行 '$regex'(类似于 'familyName + " " + 'givenName'),为此我在 $project 中使用带有 $concat 的聚合框架来生成'fullName' 字段,然后在 $match 中使用 '$regex' 来搜索该字段。我查询的猫鼬代码是:
Associate.aggregate([
$project: fullName: $concat: [
'personalInformation.givenName','personalInformation.familyName'],
$match: fullName: 'active': true, $regex: param, $options: 'i'
])
但它给了我错误:
MongoError: $concat 只支持字符串,第一个不支持 double 我的聚合管道的阶段,即 $project 阶段。
谁能指出我做错了什么?
【问题讨论】:
【参考方案1】:我也遇到了这个错误,然后发现确实是集合中的一个文档是罪魁祸首。我找到它的方法是按字段类型过滤为explained in the docs:
db.addressBook.find( "zipCode" : $type : "double" )
我发现该字段的值为NaN
,在我看来这不是一个数字,但 mongodb 将其解释为这样。
【讨论】:
【参考方案2】:查看您的代码,我不确定为什么 $concat 不适合您,除非您有一些整数潜入您的某些文档字段。您是否尝试过在您的连接值前面有一个 $ 符号?如,'$personalInformation.givenName'?您确定您的集合中的每一个 familyName 和 givenName 都是一个字符串,而不是一个双精度数吗?你的 $concat 只需要翻倍就可以弃牌。
无论如何,我在实际双打中遇到了类似的类型不匹配问题。 $concat 确实只支持字符串,通常,你要做的就是将任何非字符串转换为字符串。但是,在撰写本文时,MongoDB 3.6.2 还不支持整数/双精度 => 字符串转换,只有日期 => 字符串转换。悲伤的脸。
也就是说,请尝试在查询顶部添加此投影技巧。这对我来说是一种类型转换。只需确保提供足够长的字节长度(128 字节的名称很长,所以应该没问题)。
$project:
castedGivenName:
$substrBytes: [ 'personalInformation.givenName', 0, 128 ]
,
castedFamilyName:
$substrBytes: [ 'personalInformation.familyName', 0, 128 ]
,
$project:
fullName:
$concat: [
'$castedGivenName',
'$castedFamilyName'
]
,
$match: fullName: 'active': true, $regex: param, $options: 'i'
【讨论】:
【参考方案3】:我设法通过使用 $substr 方法使其工作,所以我的聚合管道的 $project 部分现在是:
`$project:
fullName:
$concat: [
$substr: ['$personalInformation.givenName', 0, -1] , ' ', $substr: ['$personalInformation.familyName', 0, -1]
]
`
【讨论】:
以上是关于将 $concat 与 $project 一起使用会给出错误:'MongoError: $concat 只支持字符串,而不支持双精度'?的主要内容,如果未能解决你的问题,请参考以下文章
如果STRING_AGG不为空或NULL,则将CONCAT / CONCAT_WS与STRING_AGG一起使用字符串来结果?