我有一个猫鼬模型,其中一些字段如下:
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只支持字符串,而不支持第一个字符串 我的总管道阶段,即项目阶段。
有谁可以指出我做错了什么?
答案 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将该值解释为这样。