首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MongoDB 代碼連 vs 命令行連查詢結果不一致?默認庫/集合未切換惹的禍

     編輯:程式設計疑難解答

現象複現

  • Java/Spring 代碼連接 localhost:27017,打印 5 條數據。
  • 命令行 mongo.exe 連接同地址,db.user_photo.find() 返回空。

根因:隱式默認數據庫不同

連接方式默認數據庫隱式集合
代碼 MongoClient(host, port)test(驅動默認)代碼中顯式指定或實體類映射
命令行 mongotest需手動 use your_db

代碼中可能通過 @Document(collection="user_photo") 或 mongoTemplate.getCollection("user_photo") 運作在非 test 庫(如 mydb),而命令行停留在 test 庫,故查無數據。

驗證與修正步驟

  1. 命令行切庫:
    > show dbs
    admin   0.000GB
    mydb    0.001GB  <-- 目標庫
    test    0.000GB
    > use mydb
    switched to db mydb
    > db.user_photo.find()  // 此刻應能看到數據
    
  2. 代碼顯式指定庫(推薦):
    @Bean
    public MongoDatabase mongoDatabase() {
        return mongoClient.getDatabase("mydb"); // 顯式綁定業務庫
    }
    
  3. 連接 URI 帶庫名:
    mongodb://localhost:27017/mydb?authSource=admin
    

最佳實踐原則

  • 永不依賴默認庫:代碼、腳本、命令行操作均顯式 use db 或 URI 帶庫名。
  • 集合名雙重確認:Java 實體 @Document("user_photo")、命令行 show collections 核對大小寫。
  • 認證庫分離:生產環境 authSource=admin,業務庫單獨授權,避免誤操作 admin 庫。

結論

「連接不一致」實為隱式上下文不同。養成顯式指定數據庫習慣,代碼用配置類綁定,命令行先 use db,徹底消除此類迷之 Bug。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved