【问题标题】:PHP MongoDB aggregate $match and $group and $addToSetPHP MongoDB 聚合 $match 和 $group 和 $addToSet
【发布时间】: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 位于文档的chatUser1IDchatUser2ID 字段中。

之后我想获得唯一的 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


    【解决方案1】:

    如果您不关心它们出现的顺序,您可以构建两个 user1 和 user2 数组,然后在稍后阶段将它们连接在一起。不过,这不会处理重复数据删除。

    $chatUserID = $_POST["chatUserID"]; // 2 in my example
    $chatCursor = $chatCollection->aggregate([
        [
            '$match' => [
                '$or' =>[
                    ["chatUser1ID" => $chatUserID],
                    ["chatUser2ID" => $chatUserID]
                ]
            ]
        ], [
            '$group' => [
                '_id' => 0,
                'chatUsers1' => ['$addToSet' => '$chatUser1ID'],
                'chatUsers2' => ['$addToSet' => '$chatUser2ID'],
            ]
        ], [
            '$addFields' => [
                'chatUsers' => [
                     '$concatArrays' => [
                         '$chatUsers1',
                         '$chatUsers2'
                     ]
                ]
             ]
        ],
    ]);
    

    【讨论】:

      猜你喜欢
      • 2020-09-22
      • 2019-03-27
      • 2018-07-12
      • 1970-01-01
      • 2013-03-10
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      • 2023-03-07
      相关资源
      最近更新 更多