通常当我搜索一个相关的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”?
答案 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中的ObjectId
为MongoId
(http://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],
]);