MongoDb 执行查询时注意事项

前几日,实现了两中mongodb的基础工具,一种是基于MongoClient实现的,一种是基于MongoDB\Driver\Manager 实现的,发现其中的差别还是挺大的。

一、按照时间查询时格式不一样

传统的MongoClient查询,在基于时间查询过滤时 ,array(“timestamp” => array(‘$lt’ => $start)

$start = new MongoDate(strtotime(“2018-09-01 00:00:00”));

而基于 MongoDB\Driver\Query实现的查询,

$start = new MongoDB\BSON\UTCDateTime(strtotime(“2018-09-01 00:00:00”) * 1000);

二、获取结果时

传统的MongoClient查询,返回的游标,需要通过自定义循环获取结果,例如:

while($cursor->hasNext()){
$result[] = $cursor->getNext();
}

而通过 MongoDB\Driver\Query返回的游标,可以直接调用$cursor->toArray()方法返回数组

三、排序问题

一个mongodb排序的问题:
如果有多字段排序时,语法是soft:{“key1”: 1, “key2”: 1}
虽说是个map对象,但原生的语法这样会优先排key1。
如果用gorm的bson.M{“key1”: 1, “key2”:2} 有可能因为map无序特点会优先排key2。
如果在gorm里想优先排key1要用bson.D,写法这样: bson.D{bson.E{“key1”, 1}, bson.E{“key2”, 1}}

还有排序的内存限制32M问题,可以使用 allowDiskUse 参数,就会用磁盘缓存中间结果

You May Also Like

About the Author: daidai5771

发表评论

电子邮件地址不会被公开。 必填项已用*标注