我正在查看我已接手的项目,该项目在此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
}
知道我在这里做错了什么?
答案 0 :(得分:2)
您应该使用$and
(http://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}
})
请注意,只有一个查询对象参数和一个更新对象参数。您可以在文档中查看其他可选参数。