MongoDB在_id php中搜索$

时间:2013-02-05 05:42:33

标签: php mongodb

通常当我搜索一个相关的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”?

2 个答案:

答案 0 :(得分:8)

嗯,你的rtying用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的列表,可用于搜索该字段 - relatedMongoID

这就是我正在做的事情

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

现在,MongoDB中的所有_id实际上都是ObjectId s(除非您更改了结构),因此完成此查询所需要做的是创建ObjectId的数组秒。 PHP中的ObjectIdMongoIdhttp://php.net/manual/en/class.mongoid.php

所以你需要制作一个MongoId s的数组。

首先,我遍历数组(可以使用array_walk完成)将每个数组元素的值更改为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('')]}}

哪会返回结果。

答案 1 :(得分:0)

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

$ids = [
  new \MongoDB\BSON\ObjectId('5ae0cc7bf3dd2b8bad1f71e2'),
  new \MongoDB\BSON\ObjectId('5ae0cc7cf3dd2b8bae5aaf33'), 
];
$collection->find([
  '_id' => ['$in' => $_ids],
]);