将 $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 只支持字符串,而不支持双精度'?的主要内容,如果未能解决你的问题,请参考以下文章

如何将array_concat与浮点列和数组列一起使用

如果STRING_AGG不为空或NULL,则将CONCAT / CONCAT_WS与STRING_AGG一起使用字符串来结果?

可以将聚合函数与连接一起使用吗?

JPA CONCATE 与 IN 运算符一起使用时抛出异常

仅将具有不同值的多个 GROUP_CONCAT() 的结果组合在一起

将 Android Studio 与 Vuforia 一起使用 [关闭]