PHPDaemon\Clients\Mongo\Pool::findAndModify PHP Method

findAndModify() public method

Find and modify
public findAndModify ( array $p, callable $cb ) : void
$p array Hash of properties
$cb callable Callback called when response received
return void
    public function findAndModify($p, $cb)
    {
        $this->_params($p);
        $e = explode('.', $p['col'], 2);
        $query = ['findAndModify' => $e[1]];
        if (isset($p[$k = 'rp'])) {
            $v = $p[$k];
            if (is_string($v)) {
                $v = ['mode' => $v];
            }
            $query['$readPreference'] = $v;
        }
        if (isset($p['sort'])) {
            $query['sort'] = $p['sort'];
        }
        if (isset($p['update'])) {
            $query['update'] = $p['update'];
        }
        if (isset($p['new'])) {
            $query['new'] = (bool) $p['new'];
        }
        if (isset($p['remove'])) {
            $query['remove'] = (bool) $p['remove'];
        }
        if (isset($p['upsert'])) {
            $query['upsert'] = (bool) $p['upsert'];
        }
        if (isset($p['where'])) {
            $query['query'] = $p['where'];
        } elseif (isset($p['query'])) {
            $query['query'] = $p['query'];
        }
        if ($this->safeMode) {
            static::safeModeEnc($query);
        }
        $cb = CallbackWrapper::wrap($cb);
        try {
            $this->request(self::OP_QUERY, pack('V', $p['opts']) . $e[0] . '.$cmd' . "" . pack('VV', $p['offset'], $p['limit']) . bson_encode($query) . (isset($p['fields']) ? bson_encode($p['fields']) : ''), true, null, function ($conn, $reqId = null) use($p, $cb) {
                if (!$conn) {
                    !$cb || $cb(['$err' => 'Connection error.']);
                    return;
                }
                $conn->requests[$reqId] = [$p['col'], $cb, true];
            });
        } catch (\MongoException $e) {
            Daemon::log('MongoClient exception: ' . $e->getMessage() . ': ' . $e->getTraceAsString());
            if ($cb !== null) {
                $cb(['$err' => $e->getMessage(), '$query' => $query, '$fields' => isset($p['fields']) ? $p['fields'] : null]);
            }
        }
    }