1

假设我有一个简单的数据库,并且我正在尝试查找所有会说英语和西班牙语和/或英语和法语(但不是西班牙语和法语)的用户。我有一张users桌子,上面有一些这样的记录:

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

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

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

但我不知道如何用蛋糕做到这一点。我可以像这样匹配一个语言对:

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

但是我被困在如何搜索多对上;数组数组似乎没有这样做。

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

4

1 回答 1

4

您的 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'))),
    ),
)));

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

{ "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" ] }

约翰、弗雷德和卢克回来了。

于 2012-05-14T20:16:18.000 回答