Mongodb在同一个键上的多个OR条件

时间:2015-10-16 15:41:31

标签: php mongodb mongodb-query

在我的MongoDb中,我已将文档存入我的收藏中:

array (
  '_id' => new MongoId("561f925017e74f6a08012c65"),
  'timestamp' => new MongoDate(1444877100, 0),
  'value' => 0,
)

当然所有文档都有自己的时间戳。

如何在时间戳上找到包含多个OR条件的文档? 例如,查找时间戳介于1444877100和1444877105之间或时间戳介于1444877120和1444877150之间的所有记录。

例如,在Mysql中它将是:

WHERE (
  (timestamp >= 144877100 AND timestamp <= 1444877105) OR
  (timestamp >= 1444877120 AND timestamp <= 1444877150)
)

我似乎无法正确行事或在正确的方向找到任何帮助。我也检查了这个问题(MongoDB - Multiple $or operations),但是使用了设定值,我无法弄清楚如何使用$ gte和$ lte(至少我认为这是要走的路)。

任何人都可以帮助我吗?谢谢!

2 个答案:

答案 0 :(得分:1)

你想要的是$or运算符,它对两个或多个表达式执行逻辑 OR 操作。因为$gte$lte分别选择字段的值大于或等于(即> =)指定值且小于或等于(即&lt; = )指定的值。

$result = $collection->find(['$or' => [ 
    ['timestamp' => ['$gte' => new MongoDate(1444877100), '$lte' => new MongoDate(1444877105)]], 
    ['timestamp' => ['$gte' => new MongoDate(1444877120), '$lte' => new MongoDate(1444877150)]]
]]);

由于find()返回游标,您需要使用foreach循环遍历每个元素。像这样:

foreach ( $result as $doc ) { /* dosomething(); */ }

答案 1 :(得分:0)

你试过了吗?

{ $or: [ { timestamp: { $lte: someValue, $gte: someValue2 } }, { timestamp: { $lte: someValue3, $gte: someValue4 } } ] }