在$ project中使用$ concat会出错:'MongoError:$ concat只支持字符串,而不是double'?

时间:2018-03-15 16:24:42

标签: node.js mongodb mongoose aggregate mean-stack

我有一个猫鼬模型,其中一些字段如下:

var AssociateSchema = new Schema({
    personalInformation: {
       familyName: { type: String },
       givenName: { type: String }
    }
})

我想在familyName和givenName(类似'familyName +“”+'givenName')的串联上执行'$ regex',为此我在$ project中使用$ concat的聚合框架来生成'fullName'字段然后在$ match中'$ regex'搜索该字段。我的查询中的mongoose代码是:

Associate.aggregate([
    { $project: {fullName: { $concat: [                                  
    'personalInformation.givenName','personalInformation.familyName']}}},
    $match: { fullName: { 'active': true, $regex: param, $options: 'i' } }}
])

但它给了我错误:

  

MongoError:$ concat只支持字符串,而不支持第一个字符串   我的总管道阶段,即项目阶段。

有谁可以指出我做错了什么?

2 个答案:

答案 0 :(得分:0)

查看您的代码,我不确定为什么$ concat不适合您,除非您有一些整数潜入某些文档字段。您是否尝试过在连接值前加上$ -sign?如同,' $ personalInformation.givenName'?你确定你的集合中每个familyName和givenName都是一个字符串而不是double吗?只需要一个双倍的$ concat折叠。

在任何情况下,我都有类似的实际双打类型不匹配问题。 $ concat确实只支持字符串,通常,您所做的只是将任何非字符串转换为字符串..但是,在撰写本文时,MongoDB 3.6.2还不支持integer / double =>字符串转换,只有date =>串铸。悲伤的脸。

也就是说,尝试在查询的顶部添加此投影黑客。这对我来说是一个类型转换。只要确保你提供足够长的字节长度(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' } }
}

答案 1 :(得分:0)

我也遇到了这个错误,然后发现确实要归咎于馆藏中的一个文件。我发现的方式是按字段类型过滤为explained in the docs

db.addressBook.find( { "zipCode" : { $type : "double" } } )

我发现该字段具有值NaN,在我看来这不是数字,但是mongodb将该值解释为这样。