Mongodb喜欢带数组的语句

时间:2012-05-23 00:28:38

标签: php mongodb codeigniter database nosql

我试图通过使用单个查询编译循环的代码来保存一些数据库操作,之前我只是在启动查询之前使用循环添加到类似的语句但我无法得到相同的想法进入Mongo,id欣赏任何想法.... 我基本上试图做一个像,但值为数组

('app',将'mongodb'替换为我的CI设置)

以下是我在做mongofication之前做的事情:

    foreach ($workids as $workid):
         $this->ci->app->or_like('work',$workid)    ;
    endforeach;
    $query = $this->ci->db->get("who_users");
    $results = $query->result();
    print_r($results);

这就是我希望能让它发挥作用的方式,但这里没有任何乐趣,该功能只是为了接受字符串

    $query = $this->ci->app->like('work',$workids,'.',TRUE,TRUE)->get("who_users");
    print_r($query);

如果有人能想出任何狡猾的方法,我可以再次通过一次调用得到我的返回数组,那将是很好的我没有找到关于这种查询的任何文档,我能想到的唯一方法是循环查询并将其推送到新的结果数组....但如果我的应用程序扩展,那真的会受到伤害。

1 个答案:

答案 0 :(得分:1)

您使用的是codeigniter-mongodb-library吗?根据现有的or_like()文档,CI看起来像是用%通配符包装每个匹配项。 Mongo中的等价查询将是$or子句中的一系列正则表达式匹配:

db.who_users.find({
    $or: [
    { work: /.*workIdA.*/ },
    { work: /.*workIdB.*/ },
    ...
]});

不幸的是,除非(1)work字段被索引并且(2)你的正则表达式以某个常量值(例如/^workId.*/)锚定,否则这将是非常低效的。这在Mongo的regex documentation中有更详细的描述。

根据您对OP的评论,您似乎将work字段中的多个ID存储为逗号分隔的字符串。要利用Mongo的架构,您应该将其建模为字符串数组。此后,当您在work字段上查询时,Mongo将考虑数组中的所有值(记录在案here)。

db.who_users.find({
    work: "workIdA"
});

此查询将匹配work值为["workIdA", "workIdB"]的记录。如果我们需要搜索一组ID(将其带回OR查询),我们可以使用$in运算符扩展此示例:

db.who_users.find({
    work: { $in: ["workIdA", "workIdB", ...] }
});

如果符合您的需求,请务必将work字段编入索引。