我已经为这个问题苦思冥想太久了...
我有两个MongoDB集合:"chatroom"和"users"。 "chatroom"集合具有指向"users"集合中特定单个用户的"user_id"键。
我正在尝试使用$lookup聚合查询获取与用户相关的聊天室,目前我的查询语句如下:
$this->mongo->chatroom->aggregate(
array('$lookup' => array(
'from' => 'users',
'localField' => 'user_id',
'foreignField' => '_id',
'as' => 'user'
))
);
然而,这会在集合中返回一个空的"user"字段。奇怪的是,如果我尝试用自定义的"uid"替换"_id",并将其设置为_id.$id的值,它就能按预期工作:
$this->mongo->chatroom->aggregate(
array('$lookup' => array(
'from' => 'users',
'localField' => 'user_id',
'foreignField' => 'uid', // uid = _id.$id
'as' => 'user'
))
);
我发现问题是"_id"是一个ObjectId类型,而"user_id"是一个字符串类型。但我不知道如何优雅地处理这个问题...
"localField"
和"foreignField"
必须具有相同的 BSON 类型,否则后续的“查询”将失败。就像如果您尝试使用提供的字符串而不是重新转换的_id
查询您的users
集合,那么该查询将不返回任何结果。没有区别,并且是按设计方式实现的。 - Blakes SevenObjectId
而言是如此。正确的做法是将两种类型都更改为相同的类型,以确保它们确实“匹配”。另外,始终使用mongo
shell来检查数据。它可能缺乏“花哨”的功能,但它是“保证”向您显示正确类型的唯一产品。这是一个官方产品,所以应该期望如此。接受你自己的答案。这是正确的方法。 - Blakes Seven