Mongo教程总结
最详细的还是官方文档 https://docs.mongodb.com/manual/mongo/
Java 驱动文档 https://mongodb.github.io/mongo-java-driver/4.1/driver/tutorials/databases-collections/
> show dbs
> db.inventory.insertOne({ item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } })
> db.inventory.find().pretty
基本操作
centos 7安装
下载安装包,并解压
测试安装包是否可用
配置PATH变量
- 修改文件
vim /etc/profile
使得环境变量生效
source /etc/profile
当可以不在mongo 目录下的bin 目录 运行 mongo 命令时 则环境变量生成成功
touch mongodb.conf
mkdir db
mkdir log
Mongo 数据样例
windows启动——cmd
D:\MongoDB\Server\4.4\bin> mongod --dbpath D:\MongoDB\Server\4.4\data
一些工具,如备份(mongodump)与恢复(mongorestore),需要单独下载,对应工具下载:https://www.mongodb.com/try/download/database-tools
可能的问题
- Windows 无法启动MongoDB服务 错误1067:进程意外终止
net start MongoDB
【解决】:重新配置 配置文件 进入MongoDB安装目录\data\将此文件夹下的mongod.lock删除
mongod.exe --config 【路径】\MongoDB\mongod.cfg --remove
mongod.exe --config 【路径】\MongoDB\mongod.cfg --install
- 无法访问: 使用管理员权限
{
"_id" : ObjectId("600a6785a092642696f9e6bb"),
"processStage" : {
"asdasd" : 6565.0,
"qwe" : 6565.0
},
"address_ids" : [
ObjectId("52ffc4a5d85242602e000000"),
ObjectId("52ffc4a5d85242602e000001")
],
"forecast" : [
{
"id" : ObjectId("600a6785a092642696f9e6bc"),
"sunrise" : "06:17"
},
{
"date" : "26日星期一",
"sunrise" : "06:11"
},
"spring",
"data",
"mongodb"
],
"code" : "C02D25H7ML85",
"qweqwe" : 56.0
}
查询
public static <T> void main(String[] args) {
MongoOperations mongoOps = new MongoTemplate(MongoClients.create(), "test");
MongoCollection<Document> collection = mongoOps.getCollection("647台阿里索电维修_assert");
Bson bson = Filters.eq("status", "维修");
FindIterable<Document> documents = collection.find(bson);
for(Document document : documents) {
System.out.println(document.get("data").toString());
System.out.println(document.toJson());
}
}
MongoDB CRUD Operations
一、 插入
【方法】insert / save, insertOne/ insertMany
插入文档
如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。
db.getCollection('test_data').insert(
[
{No : 10, SS : "ss" },
{No : 6, SS : "zz"}
],
{
ordered : true
}
)
db.col.insert(
{
description: 'MongoDB',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
*主键重复时
①save (覆盖),②insert(报错)
insertOne 新增第一个
insert / insertMany 新增多个
二、更新
【方法】 update / save, updateOne / updateMany/ replaceOne
save() 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入
更新文档时 必须 加上 _id (覆盖式更新,否则会新增)
在这里插入代码片
对比
save 更新 必须 加上 _id
——覆盖式更新
replaceOne 不需要 _id
只更新匹配的第一个
$set
$[i]
arrayFilter 筛选数组中元素的条件
db.getCollection('test_data').updateOne(
{
_id: ObjectId("5ac1ff4c87c0fc67c0f4fe60"),
workerStats: {
$elemMatch: {
stage: "LABEL",
idOfWorker: "admin"
}
}
},
{
$inc: {
"workerStats.$.stats.labeledItems": 1
}
})
三、 删除
【方法】: remove / deleteMany/ deleteOne
1. remove 删除 文档
四、 查询
【方法】:find/ findOne
条件查询
聚合
map-reduce
db.getCollection('asset_statistics').mapReduce(
function() { emit(this.createBy, this.count); },
function(mkey, values) { return values},
{
out:"post_total"
}
).find()
另一种形式:
var mapFunction1 = function() {
emit(this.cust_id, this.price);
};
var reduceFunction1 = function(keyCustId, valuesPrices) {
return Array.sum(valuesPrices);
};
db.orders.mapReduce(
mapFunction1,
reduceFunction1,
{ out: "map_reduce_example" }
)
db.map_reduce_example.find().sort( { _id: 1 } )
Array.sum()
对于 数组类型为 NumberLong
数据求和,当size=1时会出错,普通number不会,所以这里我们自己求和:
db.getCollection('asset_statistics').mapReduce(
function() { emit(this.createBy, this.count); },
function(mkey, values) {
var sum = 0;
for(var temp in values) {
sum = sum + values[temp];
}
return sum
},{
out:"post_total"
}
).find()
db.orders.mapReduce(
function() {
emit(this.cust_id, this.price);
},
function(keyCustId, valuesPrices) {
return Array.sum(valuesPrices);
},
{ out: "map_reduce_example" }
).find()
遇到的问题记录
Java 操作
Invalid BSON field name xx
之前的
mongoCollection.updateOne( documentFilter, parameter);
更改
mongoCollection.updateOne( documentFilter, new Document("$set", parameter)); ```
注:更新文档的值 时需要 使用 $set