我想要实现的目标
让我们说我有这个对象:
{
"_id" : ObjectId("5aec063380a7490014e88792"),
"personal_info" : {
"dialing_code": "+44",
"phone_number": "67467885664"
}
}
我需要将两个值personal_info.dialing_code(+44)和phone_number(67467885664)连成一个。 +4467467885664并将其与值进行比较。我需要从数据库中检索与该值匹配的特定记录。
问题
我在子文档中连接两个字段时遇到问题,我收到此错误:
{
"name": "MongoError",
"message": "$concat only supports strings, not object",
"ok": 0,
"errmsg": "$concat only supports strings, not object",
"code": 16702,
"codeName": "Location16702"
}
ATTEMPT#1
我试过这个:
UserModel.aggregate([
{ $unwind: '$personal_info' },
{$project: {
concat_p: {$concat: [
'$personal_info.dialing_code',
'$personal_info.phone_number'
]}
}}
])
如上所述,它给了我一个错误,结果我不能在之后做$ match。
ATTEMPT#2
我也试过这个:
UserModel.aggregate([
{ $unwind: '$personal_info' },
{$project: {
p_dialing_code: '$personal_info.dialing_code',
p_phone_number: '$personal_info.phone_number',
concat_p: {$concat: [
'$p_dialing_code',
'$p_phone_number'
]}
}}
])
我已经成功地取出了一个级别的子文档值,但是当我尝试concatinating时,它产生了我的空值。这是我得到的结果:
{
"_id": "5af0998036daa90014129d6e",
"p_dialing_code": "+44",
"p_phone_number": "13231213213244",
"concat_p": null
}
我知道如何在$ match管道上执行此操作,但我没有运气来协调子文档中的值。显然,在我比较之前,我需要先做这件事。感谢
答案 0 :(得分:1)
您似乎在personal_info.dialing_code
和personal_info.phone_number
字段下有不同的类型。在您的示例中,$concat
适用于您的集合中的每个文档,这就是您获得异常的原因,因为$concat
严格要求其参数为strings
。
因此,对于您的问题中发布的文档,它会正常工作,但会抛出这样的例外:
{
"_id" : ObjectId("5aec063380a7490014e88792"),
"personal_info" : {
"dialing_code": {},
"phone_number": "67467885664"
}
}
解决此问题的一种方法是在$match
之前添加$project
条件,并使用$type运算符仅获取要连接的字段上包含strings
的文档。< / p>
db.UserModel.aggregate([
{
$match: {
$expr: {
$and: [
{ $eq: [ { $type: "$personal_info.dialing_code" }, "string" ] },
{ $eq: [ { $type: "$personal_info.phone_number" }, "string" ] }
]
}
}
},
{$project: {
concat_p: {$concat: [
"$personal_info.dialing_code",
"$personal_info.phone_number"
]}
}}
])