2012-05-23 116 views
1

我想通过编译循环的代码与一个单一的查询来节省一些数据库操作之前,我只是添加到类似的语句使用循环之前发射查询,但我无法得到同样的想法在蒙戈去,ID欣赏任何想法.... 我基本上是试图做一个类似,但与价值作为数组Mongodb like语句与数组

(“应用”,取代了“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); 

如果任何人都可以想办法任何狡猾的方法,我可以让我回来数组再次调用它会很棒我还没有发现任何关于这种查询的文档,我能想到的唯一方法是遍历查询并将其推入一个新的结果数组......但是,如果我的应用程序扩展,真的会受到伤害。

+0

我想知道是否有可能以某种方式使用通配符执行where_in – IndelibleHeff

+0

您试图针对MongoDB运行什么样的查询?我不太了解你的问题。 – Derick

+0

以及即时检查,如果一个ID是中列出的id字段所以基本上是这样 - 让行,其中ID中包含的$ id, 我与 的foreach现在做这个($ workids为workid $): \t \t \t $ html。=“\ r \ n friendsbox [”。$ workid。“] ='';”; \t \t \t $ this-> ci-> app-> like('workids',$ workid,'im',TRUE,TRUE); \t \t endforeach; \t \t \t \t $查询= $这个 - > Cl - > APP-> GET( “who_users”); 但是,这只会返回最后一个查询,我需要一种方法来真正实现它。 ,或者更重要的是一种链接他们的方式,我认为。 – IndelibleHeff

回答

1

您使用的是codeigniter-mongodb-library?根据现有的or_like()文档,它看起来像是CI用%通配符包装每场比赛。在蒙戈等效查询将是一个$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的中的一个(采取这一回你或查询),我们可以用$in运营商扩展这个例子:

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

如果满足您的需求,请务必指数work字段也是如此。

+0

是的,你是对的,我最近转换为代码点燃MongoDB库,在新的环境中可以更好地构建 - 看起来我需要在库中构建一个函数来尝试处理多重子句。 – IndelibleHeff

+0

你确定一个新的方法是必要的吗?我没有和库一起工作,但'where_in()'看起来像你所需要的。 – jmikola