docker 命令创建mongoDB

docker pull mongo
docker run -d --name my-mongo \-e MONGO_INITDB_ROOT_USERNAME=root \-e MONGO_INITDB_ROOT_PASSWORD=123456 \-v /my/data/mongo:/data/db \-p 27017:27017 \mongodocker run -d  --name my-mongo -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=123456 -p 27017:27017 mongodocker exec -it my-mongo mongosh -u root -p 123456

docker-compose创建mongoDB


目录结构

建议这样放:

project/

│── docker-compose.yml │

 ── init-mongo.js │

 ── mongo-data/ (数据会存这里)


init-mongo.js (初始化脚本)

db = db.getSiblingDB('myapp'); // 切换/创建数据库 myapp// ========== users 集合 ==========
db.createCollection('users');// 插入用户数据
db.users.insertMany([{ username: "alice", email: "alice@example.com", role: "admin" },{ username: "bob", email: "bob@example.com", role: "user" }
]);// 索引:用户名唯一
db.users.createIndex({ username: 1 }, { unique: true });// 索引:邮箱唯一
db.users.createIndex({ email: 1 }, { unique: true });// 索引:角色 + 用户名 组合索引(方便按角色查用户并排序)
db.users.createIndex({ role: 1, username: 1 });// ========== accounts 集合 ==========
db.createCollection('accounts');// 插入账户数据
db.accounts.insertOne({ user: "alice", balance: 1000 });// 索引:user 字段(常用外键查询)
db.accounts.createIndex({ user: 1 });// 索引:余额 balance 降序(方便做排行榜)
db.accounts.createIndex({ balance: -1 });

修改后的 docker-compose.yml

version: '3.8'services:mongodb:image: mongo:6.0container_name: my-mongorestart: alwaysenvironment:MONGO_INITDB_ROOT_USERNAME: rootMONGO_INITDB_ROOT_PASSWORD: 123456ports:- "27017:27017"volumes:- ./mongo-data:/data/db- ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:romongo-express:image: mongo-express:latestcontainer_name: my-mongo-expressrestart: alwaysports:- "8081:8081"environment:ME_CONFIG_MONGODB_ADMINUSERNAME: rootME_CONFIG_MONGODB_ADMINPASSWORD: 123456ME_CONFIG_MONGODB_SERVER: mongodbdepends_on:- mongodb

添加下面的配置可以设置express的用户名和密码,包括可以访问的host

environment:ME_CONFIG_MONGODB_ADMINUSERNAME: rootME_CONFIG_MONGODB_ADMINPASSWORD: 123456ME_CONFIG_MONGODB_SERVER: mongodb# 添加以下配置解决警告ME_CONFIG_BASICAUTH_USERNAME: your_username  # 替换为你的用户名ME_CONFIG_BASICAUTH_PASSWORD: your_password  # 替换为你的密码ME_CONFIG_SERVER_ADDR: 127.0.0.1  # 限制只允许本地访问

使用步骤

  1. init-mongo.js 放在和 docker-compose.yml 同一目录

  2. 启动:

    docker-compose up -d

  3. 第一次启动时,MongoDB 会执行 init-mongo.js

    • 创建数据库 myapp

    • usersaccounts 集合

    • 插入一些初始化数据

  4.  打开浏览器访问:
    • http://localhost:8081

      就能看到 Mongo Express 管理界面 ✅


    • 📌 说明:MongoDB 数据依旧会保存在 ./mongo-data

    • 默认登录就是 admin/ pass

    • mongo-express 会自动连到 mongodb 服务


⚠️ 注意:

  • 初始化脚本 只会在容器第一次启动且数据目录为空时执行

  • 如果你已经跑过一次,需要先清掉数据目录:

    docker-compose down -v

这样 MongoDB 的 root 用户就是:

  • 用户名:root

  • 密码:123456

连接地址:

mongodb://root:123456@localhost:27017

进入容器并打开 mongosh

docker exec -it my-mongo mongosh -u root -p 123456


📌 常见操作命令

1. 查看所有数据库

show dbs

📌 会显示已有的数据库,例如:

admin 40.00 KiB

config 72.00 KiB

local 72.00 KiB

myapp 100.00 KiB


2. 切换数据库(没有会自动创建)

use myapp

👉 进入 myapp 数据库。


3. 查看当前数据库

db

👉 输出当前数据库名字,比如:

myapp


4. 查看当前数据库里的所有集合

show collections

👉 例如:

users accounts


5. 查看所有用户

admin 数据库 里管理用户。先切换到 admin:

use admin

查看所有用户:

db.getUsers()

输出类似:

[ { "_id": "admin.root", "user": "root", "db": "admin", "roles": [ { "role": "root", "db": "admin" } ] } ]


6. 查询集合里的数据

查询所有文档

db.users.find()

格式化输出

db.users.find().pretty()

查询条件(例子:用户名是 alice)

db.users.find({ username: "alice" })


7. 插入数据

db.users.insertOne({ username: "charlie", email: "charlie@example.com", role: "user" })


8. 删除数据

db.users.deleteOne({ username: "bob" })


9. 更新数据

db.users.updateOne( { username: "alice" }, { $set: { role: "superadmin" } } )


10. 查看集合索引

db.users.getIndexes()


✅ 这几个命令基本覆盖了你日常开发时 建库 → 切库 → 查表 → 插入/更新/删除数据 → 管理用户 的常见需求。

下面把 MongoDB Shell(mongosh)常用命令速查直接原样贴出来(含“怎么建库”的正确做法)。

⚠️ 提醒:MongoDB 没有独立的“create database”命令。做法是:use 库名 之后 创建集合或插入文档,库就会真正创建。

# =========================
# 连接(Docker 容器里)
# =========================
docker exec -it my-mongo mongosh -u root -p 123456# 也可以用连接串(本机/外部):
mongosh "mongodb://root:123456@localhost:27017/admin"
# 先连到 admin,再切到业务库:
use myapp# =========================
# 数据库相关
# =========================
show dbs                      # 查看所有数据库
db                           # 查看当前数据库名
use myapp                    # 切换数据库(不存在时只是切换上下文)# ——「建库」正确姿势(任意一种都会真正创建数据库)——
use myapp
db.createCollection("users")  # 方式1:创建集合
# 或
db.temp.insertOne({a:1})      # 方式2:插入任意文档(会自动建库+集合)db.dropDatabase()             # 删除当前数据库(慎用)# =========================
# 集合(表)管理
# =========================
show collections                            # 列出所有集合
db.createCollection("users")                # 新建集合
db.users.renameCollection("members")        # 重命名集合
db.users.drop()                             # 删除集合# =========================
# 文档 CRUD
# =========================
db.users.insertOne({username:"alice", role:"admin"})
db.users.insertMany([{username:"bob"},{username:"charlie"}])db.users.find()                             # 查询全部
db.users.find({username:"alice"})           # 条件查询
db.users.find({}, {username:1, _id:0})      # 投影(只要某些字段)
#在 MongoDB 中,db.users.find({}, {username:1, _id:0}) 
#这个查询中 _id 没有返回,是因为你显式指定了 _id:0,这表示排除 _id 字段。
#MongoDB 的投影(projection)规则是:
#字段名:1 表示包含该字段
#字段名:0 表示排除该字段
#而 _id 字段是一个特殊情况:
#它默认会被包含在查询结果中,即使你没有显式指定 _id:1
#只有当你显式指定 _id:0 时,才会排除它db.users.find().sort({username:1}).limit(10).skip(20)  # 排序/分页db.users.updateOne({username:"alice"}, {$set:{role:"superadmin"}})
db.users.updateMany({role:"user"}, {$inc:{score:1}})
db.users.replaceOne({_id:ObjectId("...")}, {username:"new"})db.users.deleteOne({username:"bob"})
db.users.deleteMany({role:"temp"})db.users.countDocuments({role:"admin"})     # 计数# =========================
# 索引
# =========================
db.users.createIndex({username:1}, {unique:true})   # 唯一索引
db.users.createIndex({role:1, username:1})          # 复合索引
db.users.getIndexes()                               # 查看索引
db.users.dropIndex("role_1_username_1")             # 删除某个索引
db.users.dropIndexes()                              # 删除所有二级索引(慎用)# =========================
# 聚合(Aggregation)常用模板
# =========================
db.users.aggregate([{$match: {role: "user"}},                 # 过滤{$group: {_id: "$role", cnt: {$sum: 1}}},# 分组计数{$sort: {cnt: -1}},                      # 排序{$limit: 10}                              # 取前10
])# =========================
# 用户与权限(需在 admin 库)
# =========================
use admin
db.getUsers()                               # 查看所有用户
db.createUser({user: "appuser",pwd: "123456",roles: [{role:"readWrite", db:"myapp"}]
})
db.updateUser("appuser", {roles:[{role:"read", db:"myapp"}]})
db.grantRolesToUser("appuser", [{role:"readWrite", db:"myapp"}])
db.revokeRolesFromUser("appuser", [{role:"readWrite", db:"myapp"}])
db.dropUser("appuser")# 常用内置角色举例:
#   read, readWrite, dbAdmin, userAdmin
#   clusterAdmin(集群级,慎用)
#   root(最高权限,慎用)# =========================
# 实用命令
# =========================
db.stats()                                  # 当前库统计信息
db.users.stats()                            # 集合统计信息
db.version()                                # 服务器版本
show roles                                  # 查看角色(在 admin)
show users                                  # 查看用户(在当前库)# =========================
# 连接串小技巧(authSource)
# =========================
# 用 admin 创建的 root 账号访问 myapp 时,常见报错是认证失败;
# 请在连接串加上 ?authSource=admin
# 例:
# mongodb://root:123456@localhost:27017/myapp?authSource=admin

MongoDB 查询进阶速查表

# =========================
# 1. 条件查询运算符
# =========================
db.users.find({ age: { $gt: 18 } })                # > 18
db.users.find({ age: { $gte: 18 } })               # >= 18
db.users.find({ age: { $lt: 30 } })                # < 30
db.users.find({ age: { $lte: 30 } })               # <= 30
db.users.find({ age: { $ne: 20 } })                # != 20db.users.find({ role: { $in: ["admin", "user"] } })  # in
db.users.find({ role: { $nin: ["guest"] } })         # not indb.users.find({ $or: [ {role:"admin"}, {age:{$lt:18}} ] })   # OR 查询
db.users.find({ $and: [ {age:{$gte:18}}, {age:{$lte:30}} ] }) # AND 查询# =========================
# 2. 正则 & 模糊查询
# =========================
db.users.find({ username: /alice/ })               # 模糊包含 "alice"
db.users.find({ username: /^a/ })                  # 以 a 开头
db.users.find({ username: /e$/ })                  # 以 e 结尾
db.users.find({ email: { $regex: ".*@gmail.com$" } }) # 正则完整写法# =========================
# 3. 投影(只取某些字段)
# =========================
db.users.find({}, { username:1, email:1, _id:0 })# =========================
# 4. 排序 & 分页
# =========================
db.users.find().sort({ age: -1 })                  # 按年龄降序
db.users.find().skip(20).limit(10)                 # 跳过20条,取10条
db.users.find().sort({age:-1}).skip(0).limit(5)    # 排序 + 前5条# =========================
# 5. 聚合(Aggregation)
# =========================
# 统计每个角色有多少用户
db.users.aggregate([{ $group: { _id: "$role", count: { $sum: 1 } } }
])# 统计平均年龄
db.users.aggregate([{ $group: { _id: null, avgAge: { $avg: "$age" } } }
])# 按角色分组,统计平均年龄
db.users.aggregate([{ $group: { _id: "$role", avgAge: { $avg: "$age" } } }
])# 查找年龄大于18的用户,并按年龄降序,只取前5个
db.users.aggregate([{ $match: { age: { $gt: 18 } } },{ $sort: { age: -1 } },{ $limit: 5 }
])# =========================
# 6. 去重(distinct)
# =========================
db.users.distinct("role")                         # 去重查询字段值# =========================
# 7. 常见更新技巧
# =========================
db.users.updateOne({ username:"alice" }, { $set: { age: 25 } })   # 修改字段
db.users.updateOne({ username:"bob" }, { $unset: { email: "" } }) # 删除字段
db.users.updateOne({ username:"bob" }, { $inc: { score: 5 } })    # 数字自增
db.users.updateOne({ username:"bob" }, { $push: { tags: "vip" } })# 数组 push
db.users.updateOne({ username:"bob" }, { $addToSet: { tags: "vip" } }) # 数组去重添加
db.users.updateOne({ username:"bob" }, { $pull: { tags: "old" } })# 从数组移除值# =========================
# 8. 文档计数
# =========================
db.users.countDocuments({ role:"admin" })         # 统计满足条件的数量

📌 总结:

  • 基本查询$gt/$lt/$in/$or/$regex

  • 分页排序.sort().skip().limit()

  • 聚合管道$match + $group + $sort + $limit

  • 去重distinct

  • 更新操作符$set / $unset / $inc / $push / $pull / $addToSet

MongoDB 聚合管道(Aggregation Pipeline)进阶清单

# =========================
# 1. 基础:过滤 + 分组 + 统计
# =========================
# 按角色统计用户数量
db.users.aggregate([{ $group: { _id: "$role", count: { $sum: 1 } } }
])# 按角色统计平均年龄
db.users.aggregate([{ $group: { _id: "$role", avgAge: { $avg: "$age" } } }
])# =========================
# 2. 排序 & 限制
# =========================
# 查找年龄 > 18 的前 5 个用户(按年龄降序)
db.users.aggregate([{ $match: { age: { $gt: 18 } } },{ $sort: { age: -1 } },{ $limit: 5 }
])# =========================
# 3. 投影 & 字段重命名
# =========================
# 只保留 username 和 email,并重命名 email -> contact
db.users.aggregate([{ $project: { username: 1, contact: "$email", _id: 0 } }
])# =========================
# 4. 字段计算
# =========================
# 增加一个新字段 isAdult(true/false)
db.users.aggregate([{ $addFields: { isAdult: { $gte: ["$age", 18] } } }
])# 年龄换算成年份(假设 age 表示岁数)
db.users.aggregate([{ $project: { username: 1, birthYear: { $subtract: [2025, "$age"] } } }
])# =========================
# 5. 多表关联($lookup)
# =========================
# users 表 和 accounts 表关联
db.users.aggregate([{ $lookup: {from: "accounts",          # 关联的集合localField: "username",    # 当前集合字段foreignField: "user",      # 关联集合字段as: "accountInfo"          # 输出字段名}}
])# =========================
# 6. 拆分数组($unwind)
# =========================
# 用户文档里有 tags: ["vip", "premium"]
db.users.aggregate([{ $unwind: "$tags" },   # 每个 tag 拆成一行{ $group: { _id: "$tags", count: { $sum: 1 } } }
])# =========================
# 7. 分组统计 + 条件过滤
# =========================
# 按角色统计平均年龄,但只看 count > 2 的角色
db.users.aggregate([{ $group: { _id: "$role", avgAge: { $avg: "$age" }, count: { $sum: 1 } } },{ $match: { count: { $gt: 2 } } }
])# =========================
# 8. 多阶段管道综合示例
# =========================
# 找出余额最高的前 3 个用户(users + accounts 联合查询)
db.users.aggregate([{ $lookup: {from: "accounts",localField: "username",foreignField: "user",as: "accountInfo"}},{ $unwind: "$accountInfo" },{ $project: { username: 1, balance: "$accountInfo.balance", _id: 0 } },{ $sort: { balance: -1 } },{ $limit: 3 }
])

🔑 常用聚合阶段速记

阶段作用
$match过滤文档(相当于 WHERE
$group分组统计(相当于 GROUP BY
$sort排序
$limit限制条数
$skip跳过条数(分页用)
$project投影、重命名字段
$addFields新增计算字段
$lookup关联另一张集合(相当于 SQL JOIN
$unwind拆分数组字段为多行
$count输出统计结果
$facet一次执行多个子管道(多维统计)

📊 用这套组合拳,你基本可以在 MongoDB 里实现 报表系统 / 数据分析 的 80% 需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920474.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920474.shtml
英文地址,请注明出处:http://en.pswp.cn/news/920474.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试(四):等价类和判定表

1.等价类划分表例&#xff1a;qq号等价类测试用例&#xff1a;无论有效无效&#xff0c;对应的用例都只举一个数据例子&#xff08;例子在其对应的用例情况区间任选一个即可&#xff09;自测案例写完测试用例后执行测试用例验证&#xff08;借助工具DDSP&#xff09;实际结果与…

week5-[二维数组]翻转

week5-[二维数组]翻转 题目描述 给定一个 nnn\times nnn 的正方形二维数组&#xff0c;将它旋转 180180180 度后输出。 输入格式 输入共 n1n 1n1 行。 第 111 行 111 个正整数 nnn。 接下来 nnn 行&#xff0c;每行 nnn 个正整数 aija_{ij}aij​ 表示这个二维数组。 输出格式 …

微调大模型并部署服务提供外部调用

微调大模型并部署服务提供外部调用1.背景知识介绍说明LoRA 微调算法LoRA原理&#xff1a;微调常见框架2. 环境搭建下载并使用docker compose部署 LLaMA-Factory3. 微调微调结束之后导出模型4. 本地运行模型5. 服务http调用验证应用到的技术 微调框架&#xff08; LLama-Factory…

命令行操作:逻辑运算符、重定向与管道

命令行操作&#xff1a;逻辑运算符、重定向与管道前言一、逻辑运算符1.1. 逻辑运算符 && (AND)1.2. 逻辑运算符 || (OR)1.3. 标准文件描述符 (FD)二、重定向2.1 重定向: > 与 >>2.2 重定向错误输出: 2>/ 与 2>>2.3 POSIX 推荐(经常使用)三、管道 (顺…

IDA Pro 逆向安卓 SO 库实战指南:从静态分析到动态调试

IDA Pro 逆向安卓 SO 库是一个系统性的工程。下面我将为你提供一个从环境准备、基础静态分析到高级动态调试的完整实战指南。一、 准备工作与环境搭建 所需工具IDA Pro: 主力逆向工具&#xff0c;建议使用 7.7 或更高版本&#xff0c;对 ARM/ARM64 架构支持更好。目标 APK:…

Python爬虫(47)Python异步爬虫与K8S弹性伸缩:构建百万级并发数据采集引擎

目录一、背景与行业痛点二、核心技术架构解析2.1 异步爬虫引擎设计2.2 K8S弹性伸缩架构三、生产环境实践数据3.1 性能基准测试3.2 成本优化效果四、高级优化技巧4.1 协程级熔断降级4.2 预测式扩容五、总结&#x1f308;Python爬虫相关文章&#xff08;推荐&#xff09;一、背景…

处理器的双发射是什么?

处理器的双发射是什么? 这是一个处理器微架构层面的概念,对于理解现代高性能CPU(包括一些Cortex-M7/M55/M85等高端MCU内核)如何提升性能至关重要。 核心摘要 双发射 是一种处理器设计技术,允许CPU的译码器在一个时钟周期内,同时解码并派发两条指令到不同的执行单元中去…

麒麟操作系统挂载NAS服务器

前言&#xff1a;因信创整改&#xff0c;需将原服务器的服务全部迁移到信创服务器&#xff0c;在部署完应用后&#xff0c;发现外挂了NAS服务&#xff08;可用df -h查看挂载文件&#xff09;&#xff0c;于是在信创服务器上需要挂载NAS服务器。在Linux上挂载NAS服务器可以通过多…

qt配置ros2环境,简单版本

因为不同的系统环境会有差异&#xff0c;先把我的环境介绍如下&#xff1a; 系统&#xff1a;Ubuntu22.04 ROS版本&#xff1a;ros2 humble Qt版本&#xff1a;qt-5.14.2 要配置Qt中的ros环境&#xff0c;需要在Qt的系统环境中添加2个变量&#xff0c;一个是编译环境变量、一个…

【基于C# + HALCON的工业视觉系统开发实战】三十六、PCB焊点缺陷检测:0漏检的局部变形匹配技术

摘要:针对PCB焊点检测中虚焊、锡珠、偏移三大核心缺陷,本文提出基于局部变形匹配与黄金模板的工业级解决方案。系统采用"同轴光源+四向可调支架"的硬件布局消除器件阴影,结合HALCON 24.11的局部变形匹配算法适应PCB热膨胀形变。通过多尺度模板库自学习机制实现8秒…

诺基亚无人机网络(NDN-Nokia Drone Networks):面向工业运营的全自动无人机解决方案

诺基亚无人机网络(NDN-Nokia Drone Networks)&#xff1a;面向工业运营的全自动无人机解决方案诺基亚无人机网络 (NDN) 是一款先进的全自动无人机一体化解决方案&#xff0c;旨在提升和数字化各种工业和公共安全用例。这款多功能 BVLOS 解决方案基于先进的蜂窝连接&#xff0c;…

OpenTelemetry 在 Spring Boot 项目中的3种集成方式

目录 1. 自动埋点&#xff08;Java Agent&#xff09; 2. 注解驱动&#xff08;WithSpan&#xff09; 3. 手动埋点&#xff08;SDK 编程&#xff09; 配置关键点 方案选择建议 OpenTelemetry 在 Spring Boot 项目中的应用主要有以下三种方式&#xff0c;按实现复杂度由低到…

nvue文件text标签 不同样式的文本在同一段落显示

参考链接&#xff1a;nvue中处理text为块级元素的替代解决方法_nvue 块级元素-CSDN博客 实现效果&#xff1a; nvue的text是块级元素&#xff0c;用上层加粗的绝对定位覆盖底层的文本实现 <view class"cus-text-area"><!-- nvue的text是块级元素&#xff0…

STM32的ADC寄存器操作

ADC硬件电路ADC的硬件电路主要由输入电路&#xff0c;触发信号电路&#xff0c;数据寄存器电路&#xff0c;中断电路还有数据总线这及部分构成。输入信号通道ADC的通道输入到转换器&#xff0c;每个ADC有多达18个通道&#xff0c;可测量16个外部和2个内部信号源&#xff0c;温度…

Java 实现HTML转Word:从HTML文件与字符串到可编辑Word文档

在实际开发中&#xff0c;将HTML页面或内容转换为Word文档是一项常见需求。无论是将网页报表导出为正式文档&#xff0c;还是将合同、发票等页面内容生成可编辑的Word文件&#xff0c;这种转换都能显著提升文档的复用性和归档价值。然而&#xff0c;HTML与Word在结构和渲染机制…

华为L420国产笔记本(统信UOS桌面专业版1070)安装openEuler2403虚拟机

本文探讨在华为L420国产笔记本&#xff08;操作系统为统信UOS桌面专业版1070&#xff09;中安装openEuler2403的arm版虚拟机。 一、测试环境 1、硬件设备 华为L420国产笔记本&#xff0c;CPU为华为麒麟9006C&#xff0c;内存16G 2、操作系统 统信UOS桌面专业版1070 二、安…

【STM32】将 FreeRTOS移植到STM32F103RCT6 详细流程

这篇文章是将 FreeRTOS移植到STM32F103RCT6 详细流程。创建用于移植的根文件夹&#xff0c;如 FreeRTOS-F103。也可以命名为别的名称。进入 FreeRTOS-F103 文件夹&#xff0c;在其内创建以下几个子文件夹&#xff1a;apps&#xff0c;doc&#xff0c;drivers&#xff0c;FreeRT…

京东招java开发

java开发&#xff08;岗位信息经过jobleap.cn授权&#xff0c;可在CSDN发布&#xff09;京东 四川职位描述1、负责企业金融资金、支付基础支撑相关系统建设&#xff1b; 2、负责重点项目、日常需求的承接&#xff0c;按期保质保量交付&#xff1b; 3、负责系统的日常维护及技术…

文本处理与模型对比:BERT, Prompt, Regex, TF-IDF

1. BERT (Bidirectional Encoder Representations from Transformers) BERT是一种基于Transformer架构的深度双向预训练语言模型。它通过在海量文本上进行预训练&#xff08;如掩码语言模型任务&#xff09;&#xff0c;学习到丰富的语言表征&#xff0c;并可以通过微调&#x…

流量迷局 - 理解负载均衡(L4/L7)与CDN背后的“隐形路由

《网络迷踪:SRE的TCP/IP故障排查艺术》 系列第七篇:流量迷局 - 理解负载均衡(L4/L7)与CDN背后的“隐形路由” “案发现场”: 你在排查一个问题时,让用户提供他ping你服务域名的结果。 在北京的用户,ping app.mycompany.com,显示的IP地址是 111.222.1.100。 在广州的用户…