查询文档';使用过滤器和选项在PHP MongoDB中创建数组字段
我正在使用PHP MongoDB\Driver\Manager,我想通过创建一个MongoDB\Driver\query进行查询 因此,我有以下系列设计:查询文档';使用过滤器和选项在PHP MongoDB中创建数组字段,php,mongodb,mongodb-query,nosql,Php,Mongodb,Mongodb Query,Nosql,我正在使用PHP MongoDB\Driver\Manager,我想通过创建一个MongoDB\Driver\query进行查询 因此,我有以下系列设计: { "_comment": "Board", "_id": "3", "player": "42", "moves": [{ "_id": "1", "piece": "b3rw4", "from_pos": "E2", "to_pos": "E4
{
"_comment": "Board",
"_id": "3",
"player": "42",
"moves": [{
"_id": "1",
"piece": "b3rw4",
"from_pos": "E2",
"to_pos": "E4"
}]
}
我如何查询此集合以接收特定玩家的所有棋盘的所有最小移动(id)?这意味着我首先要过滤所有棋盘,只获取具有玩家ID的棋盘。然后我要搜索所有这些棋盘的“移动”字段,其中我需要“移动”字段的最小值(_ID)
我目前有以下问题:
$filter = ['player' => '93'];
$options = [
'projection' => ['_id' => 0,
'moves' => 1]
];
$query = new MongoDB\Driver\Query($filter, $options);
这将导致玩家93找到所有“移动”数组
然后,我如何通过只获取带有min(\u id)的移动来过滤所有这些“移动”字段呢?好的,所以我找到了答案。我只需要使用聚合管道 以下是给出预期输出的shell命令:
db.boards.aggregate( [
{
$match: {'player': '93'}
},
{
$unwind: {path: '$moves'}
},
{
$group:
{
_id: '$_id',
first_move: { $min: '$moves._id' },
from_pos : { $first: '$moves.from_pos' },
to_pos: { $first: '$moves.to_pos' }
}
}
])
下面是使用命令和聚合的相应PHP MongoDB代码:
$command = new MongoDB\Driver\Command([
'aggregate' => 'boards',
'pipeline' => [
['$match' => ['player' => '93']],
['$unwind' => '$moves'],
['$group' => ['_id' => '$_id',
'firstMove' => ['$min' => '$moves._id'],
'from_pos' => ['$first' => '$moves.from_pos'],
'to_pos' => ['$first' => '$moves.to_pos']
]
]
],
'cursor' => new stdClass,
]);
$manager = new MongoDB\Driver\Manager($url);
$cursor = $manager->executeCommand('db', $command);