【问题标题】:MongoDB search with CakePHP and multiple $all使用 CakePHP 和多个 $all 进行 MongoDB 搜索
【发布时间】:2012-05-08 20:53:03
【问题描述】:

假设我有一个简单的数据库,我正在尝试查找所有会说英语和西班牙语和/或英语和法语(但不是西班牙语和法语)的用户。我有一个users 表,其中包含一些这样设置的记录:

{
    "username": "jdoe",
    "languages": ["english", "spanish", "french"]
}

当我这样搜索时,我得到了预期的结果:

db.find({ "languages" : { $all:['english', 'spanish'], $all:['english', 'french'] } })

但我不确定如何使用 Cake。我可以像这样匹配一个语言对:

$this->User->find('all', array('conditions' => 'User.languages' => array('$all' => array('english', 'spanish'))));

但我不知道如何搜索多对;数组数组似乎没有这样做。

这是别人开始的项目,所以我对 CakePHP 或 MongoDB 的细微差别不是特别熟悉;我有一种感觉,我忽略了一些明显的东西。有什么想法吗?

【问题讨论】:

    标签: cakephp mongodb


    【解决方案1】:

    您的 shell 查询示例可能返回了您的测试数据的预期结果,但它在技术上是不正确的,因为您正在破坏查询对象中的 $all 属性。使用顶级 $or 运算符,正确的查询将是:

    db.users.find({"$or": [
        {"languages": {"$all": ["english", "spanish"]}},
        {"languages": {"$all": ["english", "french"]}}
    ]});
    

    这转换为 CakePHP 为:

    $results = $this->User->find('all', array('conditions' => array(
        '$or' => array(
            array('User.languages' => array('$all' => array('english', 'spanish'))),
            array('User.languages' => array('$all' => array('english', 'french'))),
        ),
    )));
    

    我在 CakePHP 应用程序中使用以下夹具数据(无 _id's)对此进行了测试:

    { "username" : "john", "languages" : [ "english", "spanish", "french" ] }
    { "username" : "mike", "languages" : [ "spanish", "french" ] }
    { "username" : "bill", "languages" : [ "english" ] }
    { "username" : "fred", "languages" : [ "english", "french" ] }
    { "username" : "luke", "languages" : [ "english", "spanish" ] }
    

    约翰、弗雷德和卢克返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多