如何通过查询同一文档中的多个字段来搜索Mongodb

时间:2014-06-04 08:32:27

标签: php mongodb symfony doctrine nosql

我正在查看我已接手的项目,该项目在此doctrine/mongoDB查询中崩溃:

/**
 * Deactivate all Device documents via set 'activate = false' and unsetting 
 * passenger field for all devices that has passenger = $oPassenger 
 * and Device._id != oDevice
 * @param Document\Device $oDevice
 * @param Document\Passenger $oPassenger
 */
public function deactivateDuplicateDevices(Document\Device $oDevice,
                                           Document\Passenger $oPassenger)
{
    $passengerId = new \MongoId($oPassenger->getId());
    $deviceId = new \MongoId($oDevice->getId());

    return $this->createQueryBuilder('Device')
        ->update()
        ->multiple(true)
        ->field('activated')->set(false)
        ->field('passenger')->unsetField()->equals($passengerId)
        ->field('_id')->notEqual($deviceId)
        ->getQuery()
        ->execute();
}

在我看来,作者正在同一个文档上运行多个查询,即 找到所有文件

  • 乘客== passengerId AND

  • device!= deviceId

我尝试逐个重新创建此查询(在JSON中并在mongo控制台上运行它)以查看问题所在。这是我得到的最终输入(对mongo发起,这可能看起来很荒谬......但请耐心等待):

db.Device.update(
    {
        passenger:{
                    $ne: "538c6eac3c0ab224080041aa"
                  }
    },
    {
        _id:{
                $ne: "538eb8d205dafff40a0041ad"
            } 
    }
    {
        $unset:{ 
                    passenger:""
                }
    },
    {
        $set:
                {
                    activated:false
                }
    }               
)

我想测试第一部分,即多个查询(显然只搜索乘客和_id单独工作..但当我合并时):

db.Device.find({
                    _id:{
                            $ne:ObjectId("538eb8d205dafff40a0041ad")
                        }
                }, 
                {
                    passenger:{
                            $ne:"538c6eac3c0ab224080041aa"
                        }
                } 
)

我收到此错误:

error: {
    "$err" : "Can't canonicalize query: BadValue Unsupported projection option: passenger: { $ne: \"538c6eac3c0ab224080041aa\" }",
    "code" : 17287
}

知道我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

您应该使用$andhttp://docs.mongodb.org/manual/reference/operator/query/and/

db.Device.find({ $and: [ {
                _id:{
                        $ne:ObjectId("538eb8d205dafff40a0041ad")
                    }
            }, 
            {
                passenger:{
                        $ne:"538c6eac3c0ab224080041aa"
                    }
            } ] }
)

答案 1 :(得分:2)

你可以简单地做

db.Device.find({
                    _id: {$ne: ObjectId("538eb8d205dafff40a0041ad")},
                    passenger: {$ne: "538c6eac3c0ab224080041aa"}
               })

db.Device.update({
                      _id: {$ne: ObjectId("538eb8d205dafff40a0041ad")},
                      passenger: {$ne: "538c6eac3c0ab224080041aa"}
                 },
                 {
                     $unset: {passenger: 1},
                     $set: {activated: false}
                 })

请注意,只有一个查询对象参数和一个更新对象参数。您可以在文档中查看其他可选参数。