hello,word

fastadmin mongodb 处理及使用

1.需要安装mongodb,使用的宝塔,在软件商城中安装

2.安装mongodb的扩展,使用的宝塔\phpstudy环境,在需要的网站->php环境配置中安装monogdb的扩展

3.使用composer安装mongodb/mongodb库

composer require mongodb/mongodb

      3.1)如果你安装php的mongodb扩展,使用

        use MongoDB\Client;

      new MongoDB\Client();

      报错     致命错误: Class 'MongoDB\Client' not found   大概率是没有进行步骤3

     如果安装了MongoDB的扩展,那么可以使用\MongoDB\Driver\Manager类作为底层驱动操作

4.常用方法,后续增加,此处不全

// MongoDB 连接(替换成你的)

$mongo = new MongoClient("mongodb://username:password@localhost:27017");// 或无认证 mongodb://localhost:27017

$db = $mongo->selectDatabase('your_database');// 数据库名

$collection = $db->selectCollection('charging_stations'); // 集合名

$metaCollection = $db->selectCollection('charging_meta'); // 存储元数据(上次哈希、更新时间)

$lastMeta = $metaCollection->findOne(['type' => 'evroam_hash']);// 获取上次哈希

$lastHash = $lastMeta['hash'] ?? '';

$collection->deleteMany([]); // 清空旧数据

$collection->insertMany($batch);// 批量插入(提高性能)

// 更新元数据哈希和时间

$metaCollection->updateOne(

  ['type' => 'evroam_hash'],  //where条件

  ['$set' =>[ 'hash' => $newHash, 'updated_at' => new UTCDateTime(time() * 1000), 'total_sites' => count($allData) ]],//更新内容

        ['upsert' => true]//不存在是否插入

);

5常见错误

$mongo = new MongoDB\Client("mongodb://username:pwd@host:port?authSource=xxl"); 没有认证失败,但是取不到test 集合的数据,

new \MongoDB\Driver\Manager("mongodb://username:pwd@host:port/xxl");使用底层方法,可以取出数据

new MongoDB\Client("mongodb://username:pwd@host:port/?authSource=admin");如果使用,报错Authentication failed.

1.宝塔建的mongo库,认证信息在指定的数据库中,不存储在admin

2.另外两条时间太长忘记原因了。自己具体问题具体分析吧。大概率是参数原因,例如$mongo->xxl->test->find([])可以取到

网上找到一个封装底层的类,进行删除,单个直接执行删除正常,但是如果删除之后又其他操作,比如插入,则不报错,且未删除。

代码如下:

$site = Mongodb::getMongo()->table('xxl_charging_sites');
 $site->delete();
改进为
 $site->where([])->delete();//需要增加where条件,否则会有防误删机制

 

 

6.mongodb中有用来计算经纬度的吗?比如5公里范围内的充电站

$collection = $mongo->xxl->xxl_charging_sites;

$lon = 116.397428; // 中心经度

$lat = 39.90923; // 中心纬度

$radiusKm = 5;

// 方式2:$near + $maxDistance(推荐,简单)

$results = $collection->find([ 'location' => [ '$near' => [ '$geometry' => ['type' => 'Point', 'coordinates' => [$lon, $lat]], '$maxDistance' => $radiusKm * 1000 // 转米 ] ] ]);

foreach ($results as $station) {

  print_r($station); // 输出充电站

}

mongo的内部结构为

[
  {
     "_id": "697af5c855670000cc002e02",
     "chargingStationId": "c6df82b3-a8f2-4d05-a1d8-2037ea8f6ed7",
     "location": { "type": "Point", "coordinates": [175.402147, -39.177432] },
     "operator": "ChargeNet NZ",
     // ... 其他字段
  },
]

 



 

 

 

posted @ 2026-01-30 10:03  tying  阅读(11)  评论(0)    收藏  举报