【发布时间】:2020-11-22 23:52:21
【问题描述】:
在 MongoDB 中有这个文档结构:
{
"_id":<MongoDBID>,
"chatUser1ID": 2,
"chatUser2ID": 3
}
现在我想从 Mongo 获取所有聊天伙伴,其中 ID 为 2 的聊天伙伴包含在“chatUser1”或“chatUser2”中。为此,我想使用 $match 和 $group 函数。
$chatUserID = $_POST["chatUserID"]; // 2 in my example
$chatCursor = $chatCollection->aggregate([
[
'$match' =>
[
'$or' =>
[
["chatUser1ID" => $chatUserID],
["chatUser2ID" => $chatUserID]
]
]
]
,[
'$group' =>
[
'_id' => 0,
'chatUsers' => ['$addToSet' => '$chatUser1ID'],
'chatUsers' => ['$addToSet' => '$chatUser2ID'],
'chatUsers1' => ['$addToSet' => '$chatUser1ID'],
'chatUsers2' => ['$addToSet' => '$chatUser2ID'],
]
]
]);
'chatUsers1' => ['$addToSet' => '$chatUser1ID'],
这是将字段 chatUser1ID 的所有 ID 放入 chatUsers1 集合中,并且
'chatUsers2' => ['$addToSet' => '$chatUser2ID']
将字段chatUser2ID 的所有ID 放入chatUsers2 集中,其中$chatUserID 位于文档的chatUser1ID 或chatUser2ID 字段中。
之后我想获得唯一的 ID
$chatUserIDs = array();
foreach ($chatCursor as $counter => $document) {
$bson = MongoDB\BSON\fromPHP($document);
$value = MongoDB\BSON\toJSON($bson);
$value = json_decode($value, true);
$chatUserIDs = array_unique(array_merge($value['chatUsers1'], $value['chatUsers2']));
}
unset($chatUserIDs[array_search($chatUserID, $chatUserIDs)]);
array_unshift($chatUserIDs);
所以基本上它可以工作,但我想要一个解决方案,我可以立即从数据库中获取唯一 ID 列表。 本来我以为台词
'chatUsers' => ['$addToSet' => '$chatUser1ID'],
'chatUsers' => ['$addToSet' => '$chatUser2ID'],
会将 ID 添加到集合 chatUsers 但不幸的是该集合在第二行被覆盖。有没有办法将ID“附加”到集合而不是覆盖它们?也许是我可以排除 $chatUserID 的一种方式,因为我只想要聊天伙伴。
提前致谢。
【问题讨论】:
标签: php mongodb mongodb-query aggregation-framework