0

通常当我搜索一个相关的 ID 时,我会这样做:

$thisSearch = $collection->find(array(
    'relatedMongoID' => new MongoId($mongoIDfromSomewhereElse)
));

如果我想做这样的事情,我会怎么做:

$mongoIdArray = array($mongoIDfromSomewhereElseOne, $mongoIDfromSomewhereElseTwo, $mongoIDfromSomewhereElseThree);
$thisSearch = $collection->find(array(
        'relatedMongoID' => array( '$in' => new MongoId(mongoIdArray)
    )));

我已经尝试过使用和不使用新的 MongoId(),我什至没有运气尝试过。

foreach($mongoIdArray as $seprateIds){

$newMongoString .= new MongoId($seprateIds).', ';

}
$mongoIdArray = explode(',', $newMongoString).'0';

当您需要在每个 _id 上运行新的 MongoID() 时,如何搜索“$in”“_id”?

4

2 回答 2

8

嗯,你想用 SQL 的方式来做:

foreach($mongoIdArray as $seprateIds){

$newMongoString .= new MongoId($seprateIds).', ';

}
$mongoIdArray = explode(',', $newMongoString).'0';

而是尝试:

$_ids = array();
foreach($mongoIdArray as $seprateIds){
    $_ids[] = $serprateIds instanceof MongoId ? $seprateIds : new MongoId($seprateIds);
}
$thisSearch = $collection->find(array(
    'relatedMongoID' => array( '$in' => $_ids)
));

这应该产生一个ObjectId可用于搜索该字段的 s 列表 - relatedMongoID

这就是我正在做的

基本上,如文档(https://docs.mongodb.org/v3.0/reference/operator/query/in/)中所示$in,MongoDB 的运算符实际上需要一个数组,因此您需要在 PHP 中复制此结构,因为PHP 驱动程序是 1-1 与大多数方面的文档(在某些需要使用附加对象的区域除外,例如MongoRegex:)

现在,_idMongoDB 中的所有 s 实际上都是ObjectIds(除非您更改了结构),因此完成此查询所需要做的就是创建一个ObjectIds 数组。ObjectIdPHP 中的MongoId( http://php.net/manual/en/class.mongoid.php )

所以你需要制作一个MongoIds数组。

首先,我遍历数组(可以用 来完成array_walk)将每个数组元素的值更改为 a MongoId,并使用封装在该对象中的旧值:

foreach($mongoIdArray as $seprateIds){
    $_ids[] = $serprateIds instanceof MongoId ? $seprateIds : new MongoId($seprateIds);
}

我这里使用了一个三元运算符来查看该值是否已经是一个MongoId封装的值,如果没有封装它。

然后我将这个新数组添加到查询对象以形成$in查询数组,如主要 MongoDB 文档中所示:

$thisSearch = $collection->find(array(
    'relatedMongoID' => array( '$in' => $_ids)
));

所以现在当查询被发送到服务器时,它形成了一个类似于:

{relatedMongoId: {$in: [ObjectId(''), ObjectId('')]}}

这将返回结果。

于 2013-02-05T08:16:01.913 回答
1

嗯......我遇到了同样的问题,由于 API 可能已经改变,因此解决方案可能不再相关。我解决了这个问题:

$ids = [
  new \MongoDB\BSON\ObjectId('5ae0cc7bf3dd2b8bad1f71e2'),
  new \MongoDB\BSON\ObjectId('5ae0cc7cf3dd2b8bae5aaf33'), 
];
$collection->find([
  '_id' => ['$in' => $_ids],
]);
于 2018-04-25T19:55:35.257 回答