我想要实现的
让我们说,我有一个目标:
{
"_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"
}尝试#1
我试过这样做:
UserModel.aggregate([
{ $unwind: '$personal_info' },
{$project: {
concat_p: {$concat: [
'$personal_info.dialing_code',
'$personal_info.phone_number'
]}
}}
])正如上面提到的那样,它给了我一个错误,因此我不能马上执行$match。
尝试#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'
]}
}}
])我已经成功地取出了一个级别的子文档值,但是当我尝试连接时,它会产生空值。这就是我得到的结果:
{
"_id": "5af0998036daa90014129d6e",
"p_dialing_code": "+44",
"p_phone_number": "13231213213244",
"concat_p": null
}我知道如何在$match管道上这样做,但我对子文档中的值串连却没有运气。显然,我需要先做这个,然后才能比较。谢谢
发布于 2018-05-17 18:02:54
在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的文档。
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"
]}
}}
])https://stackoverflow.com/questions/50397124
复制相似问题