我正在尝试使用Jenssegers雄辩模型在Laravel中模拟一个MongoDB查询。
查询是这样的:
db.getCollection('users').find({
$and : [
{$or : [
{ "user.gender" : "male"},
{"user.location" : "NYC"}
]},
{$and : [
{"user.name" : "User Name"},
{"user.id" : "10143224362247922"}
]}
]
})它是一个和两个集合,第一个集是值的OR,而第二个集是另一个集和值集。
我使用以下查询:
$query = array(
'$and' => array(
'$or' => array(
"user.gender" => "male",
"user.location" => "NYC",
),
'$and' => array(
"user.name" => "User Name",
"user.id" => "10143224362247922",
),
)
);
$cursor = User::raw()->find($query, array(
"_id" => false,
));但是我得到了一个错误:无法规范化查询: BadValue,需要一个数组
我做错什么了?
发布于 2015-06-19 03:04:14
在这里,表示真正数组的PHP语法是错误的,但主要是您自己陷入了不必要的结束语,因为您对MongoDB查询语法的最初理解在一开始就遗漏了一些要点。
虽然初始查询确实有效,但您使用的两种$and操作都是不必要的,因为除非另有说明,否则MongoDB查询中的所有参数都被视为“隐式和”操作。
因此,它可以更有效地写成:
db.getCollection('users').find({
"$or" : [
{ "user.gender" : "male"},
{ "user.location" : "NYC"}
],
"user.name" : "User Name",
"user.id" : "10143224362247922"
})或者在PHP语法中是这样的:
$query = array(
'$or' => array(
array( "user.gender" => "male" ),
array( "user.location" => "NYC" )
),
array( "user.name" => "User Name" ),
array( "user.id" => "10143224362247922" )
);然而,在我看来,这里仍然有一个问题。如果您的意图是在数组的单个元素中匹配这些属性,那么您的查询就无法工作。
与MongoDB匹配数组的方法是,条件可以匹配数组中的任何数组元素。因此,这些条件可能存在于数组项中,但不一定全部存在于one元素中。
对于这种情况,您可以使用$elemMatch,它基本上将自己的一组查询条件应用于每个数组元素作为测试。只有当满足该特定元素的所有条件时,元素(因此是文档)才被认为是匹配的:
db.getCollection('users').find({
"user": {
"$elemMatch": {
"$or": [
{ "gender" : "male"},
{ "location" : "NYC" }
],
"name" : "User Name",
"id" : "10143224362247922"
}
}
})对于PHP:
$query = array(
'user' => array(
'$elemMatch' => array(
'$or' => array(
array( "gender" => "male" ),
array( "location" => "NYC" )
),
array( "name" => "User Name" ),
array( "id" => "10143224362247922" )
)
)
);因此,对于数组元素上的“单一”条件,您使用的“点符号”是很好的。但是对于“多”条件,则使用$elemMatch代替。
另外,如果您在转换典型的JSON语法示例时遇到问题,那么您可以使用json_encode测试您的PHP结构。这至少向您展示了JSON序列化,以便您可以进行比较。也是一个不错的日志记录工具,IMHO是在应用程序中调试的最佳初始方法。
https://stackoverflow.com/questions/30928137
复制相似问题