如何使用$ bit运算符在php中查询mongodb

时间:2014-08-19 02:34:15

标签: php mongodb bit

我有一个像bellow这样的文件,现在我要弄清楚在friendsR中哪个元素的可读性和可读性。 2比0更重要。这里的任何人都可以帮助我吗?谢谢。

[代码]

$doc = array('friendsR' => array(
                 array('friend_id'=>100, 'readable' => 7, 'bridge'=>5),
                 array('friend_id'=>100, 'readable' => 7, 'bridge'=>6),
                 array('friend_id'=>100, 'readable' => 7, 'bridge'=>7))
);

datamodel()->insert($doc);

$macher = array('$bit' => array( 'friendsR.$.readable' => array('and'=>2) ));

$cursor = datamodel()->find($macher);

[/代码]

1 个答案:

答案 0 :(得分:0)

$bit运算符是"update operator",因此它用于更改值而不是查询它们。

如果您需要此类查询,则需要进行JavaScript评估,例如$where

对于在shell中看起来像这样的文档:

{
     "friendsR": [
         { 'friend_id': 100, 'readable': 7, 'bridge': 5 },
         { 'friend_id': 100, 'readable': 7, 'bridge': 6 },
         { 'friend_id': 100, 'readable': 7, 'bridge': 7 }             
     ]
}

要查找具有匹配元素的文档,您可以执行此操作:

$macher = array( 
   '$where' => new MongoCode("function(){ 
       return this.friendsR.some(function(x) { 
           return ( x.readable & 2 ) > 0 
       })
    }")
);

实际返回"哪些元素"匹配你将再次使用mapReduce做这样的事情。它会"标记"数组中的哪些项符合条件,并且仅返回至少一个匹配的数组成员的文档。

$map = new MongoCode("function(){ 
    this.friendsR.forEach(function(friend) {
        friend.macthed = ( ( friend.readable & 2 ) > 0 );
    });

    if ( this.friendsR.some(function(x) { return x.matched }) )
        emit( this._id, this );
}");

$reduce = new MongoCode("function(){}");

$result = $db->command(array(
    "mapreduce" => "collection_name",
    "map" => $map,
    "reduce" => $reduce,
    "out" => array( "inline" => 1 )
));

没有用于按位评估的内置运算符,因此JavaScript是唯一可用的选项。

请注意,mapReduce是一个命令,必须从Db对象运行,结果如图所示以内联方式返回或输出到另一个集合。这不会返回游标。有关详细信息,请参阅mapReduce上的官方文档。