2016-02-20 60 views
0

一个foreignField我打我的头在桌子上太久这一个...

我有两个MongoDB的集合:“聊天室”和“用户”。 “聊天室”集合具有指向“用户”集合中特定单个用户的“user_id”键。

我试图与使用$查找汇总查询用户获取的聊天室,我目前拥有的是这一个:

$this->mongo->chatroom->aggregate(
    array('$lookup' => array(
     'from' => 'users', 
     'localField' => 'user_id', 
     'foreignField' => '_id', 
     'as' => 'user' 
    )) 
); 

然而,这个返回集合中的一个空的“用户”字段。奇怪的是,如果我试图取代“_id”自定义“UID”设置为_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“是一个字符串。但我不知道如何处理这个问题很好......

回答

0

为了回答我自己的问题,我通过将“user_id”作为“MongoId”类的实例而不是普通字符串来解决问题。基本上,我店“user_ID的”为:

$mongoObject["user_id"] = new MongoId($this->user_id); 

另一种解决方案可能会被用等于“ _id $ ID”的值与装饰“UID”字段的对象。

+1

它实际上不是*“绕着问题”(原文如此)*,而是“纠正”问题。就像发布任何**查询一样,数据必须是相同的“类型”以匹配。所以''localField''和''ForeignField''必须都具有相同的BSON类型,否则随后的“查询”失败。就好像你试图用'_id'作为字符串查询你的'users'集合而不是重新转换,那么这个查询就不会返回结果。没有区别,并通过设计。 –

+0

是的,我得到这一点,并认同这是一个正确的行为 - 只是有点困惑,因为我找不到任何方式来进行转换聚合查询和可视化工具没有告诉我的类型(只是显示值作为串)。 –

+1

您不能对所有类型进行聚合(有一些有趣的例外,但这是一般规则),或者至少不能用于“ObjectId”。正确的做法是将两种类型切换成相同的,以确保它们“匹配”。还总是使用'mongo' shell来检查数据。它可能缺乏“花里胡哨”,但它是“保证”向您展示正确类型的一件事。这是一个官方产品,所以应该是预期的。接受你自己的答案。这是正确的方法。 –