首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB中两集算子的简赛克

MongoDB中两集算子的简赛克
EN

Stack Overflow用户
提问于 2015-06-19 00:36:56
回答 1查看 1.8K关注 0票数 0

我正在尝试使用Jenssegers雄辩模型在Laravel中模拟一个MongoDB查询。

查询是这样的:

代码语言:javascript
复制
db.getCollection('users').find({
    $and : [
       {$or : [
           { "user.gender" : "male"},
           {"user.location" : "NYC"}
       ]}, 
       {$and : [
           {"user.name" : "User Name"},
           {"user.id" : "10143224362247922"}
       ]}
   ]
})

它是一个和两个集合,第一个集是值的OR,而第二个集是另一个集和值集。

我使用以下查询:

代码语言:javascript
复制
$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,需要一个数组

我做错什么了?

EN

回答 1

Stack Overflow用户

发布于 2015-06-19 03:04:14

在这里,表示真正数组的PHP语法是错误的,但主要是您自己陷入了不必要的结束语,因为您对MongoDB查询语法的最初理解在一开始就遗漏了一些要点。

虽然初始查询确实有效,但您使用的两种$and操作都是不必要的,因为除非另有说明,否则MongoDB查询中的所有参数都被视为“隐式和”操作。

因此,它可以更有效地写成:

代码语言:javascript
复制
db.getCollection('users').find({
    "$or" : [
        { "user.gender" : "male"},
        { "user.location" : "NYC"}
    ], 
    "user.name" : "User Name",
    "user.id" : "10143224362247922"
})

或者在PHP语法中是这样的:

代码语言:javascript
复制
$query = array(
    '$or' => array(
         array( "user.gender" => "male" ),
         array( "user.location" => "NYC" )
     ),
    array( "user.name" => "User Name" ),
    array( "user.id" => "10143224362247922" )
);

然而,在我看来,这里仍然有一个问题。如果您的意图是在数组的单个元素中匹配这些属性,那么您的查询就无法工作。

与MongoDB匹配数组的方法是,条件可以匹配数组中的任何数组元素。因此,这些条件可能存在于数组项中,但不一定全部存在于one元素中。

对于这种情况,您可以使用$elemMatch,它基本上将自己的一组查询条件应用于每个数组元素作为测试。只有当满足该特定元素的所有条件时,元素(因此是文档)才被认为是匹配的:

代码语言:javascript
复制
db.getCollection('users').find({
    "user": {
        "$elemMatch": {
            "$or": [
                { "gender" : "male"},
                { "location" : "NYC" }
            ],
            "name" : "User Name",
            "id" : "10143224362247922"
        }
    }
})

对于PHP:

代码语言:javascript
复制
$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是在应用程序中调试的最佳初始方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30928137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档