【发布时间】:2018-05-18 02:02:54
【问题描述】:
我想要达到的目标
假设我有这个对象:
{
"_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 管道上执行此操作,但我没有运气连接子文档中的值。显然,我需要先这样做才能进行比较。谢谢
【问题讨论】:
-
两件事可能会有所帮助:1.
$unwind用于数组而不是嵌套对象 2. 第一个示例适用于您的示例文档。也许您的收藏中有一些具有不同“模式”的文档。这可能吗? -
即使我删除了
$unwind,第一个示例也不起作用。我在personal_info对象中有其他文档。在示例中,为了示例,我只是专门获取 dialing_code 和 phone_number。但在其中,是的,我也有嵌套对象,但我不需要处理它。这会影响我的查询吗? -
顺便说一句,在“模式”设计级别,我没有为内部字段显式定义字符串类型,因为我使其无模式,即
personal_info: mongoose.Schema.Types.Mixed,。这可能是我无法获得结果的问题吗?
标签: mongodb