1

我试图通过使用单个查询编译一段循环代码来保存一些数据库操作,在我只是在触发查询之前使用循环添加到类似的语句之前,但我无法在 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);

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

4

1 回答 1

1

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

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

不幸的是,这将是非常低效的,除非(1)该work字段被索引并且(2)你的正则表达式被锚定了一些常数值(例如/^workId.*/)。这在 Mongo 的正则表达式文档中有更详细的描述。

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

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

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

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

如果这满足您的需求,请确保也为该work字段编制索引。

于 2012-05-23T18:35:26.650 回答