我有一个像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);
[/代码]
答案 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上的官方文档。