0、Windows下使用从MongoDB官网下载MSI安装文件,感觉比zip的安装包使用便捷。Ubuntu Linux下使用sudo apt install mongodb-server
安装、其配置文件路径为/etc/mongodb.conf
、可以通过在其中配置数据库路径。
Mac下使用brew install mongodb
,其配置信息可参考如下:
1、mongod --bind_all
默认只能本机访问MongoDB、使用此选项可以让别的机器通过网络访问
2、如果不能访问,检查端口是否开放,默认为27017。AWS的EC2需要在入站规则中加入该端口才会生效。
3、使用mongo
进入数据库后、创建用户与密码。
db.collection.insert(
<document or array of documents>,
{
writeConcern: <document>, //
ordered: <boolean> // 按顺序插入
}
)
db.inventory.insertOne(
{ item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
)
Updates an existing document or inserts a new document, depending on its document parameter.
一般查询:
db.inventory.find( {} )
db.inventory.find( { status: "D" } )
使用查询操作符查询:
更多查询操作符:https://docs.mongodb.com/manual/reference/operator/query/
// 格式:{ : { : }, ... }
db.inventory.find( { status: { $in: [ "A", "D" ] } } )
使用AND
// status==‘A’ && qty < 30
db.inventory.find( { status: "A", qty: { $lt: 30 } } )
使用OR
// status==‘A’ || qty < 30
db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )
// status=='A' && (qty < 30 || item like 'p%')
db.inventory.find( {
status: "A",
$or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} )
正则表达式
详细可参考:https://docs.mongodb.com/manual/reference/operator/query/regex/
/* 格式:
{ : { $regex: /pattern/, $options: '' } }
{ : { $regex: 'pattern', $options: '' } }
{ : { $regex: /pattern/ } }
-----
{ : /pattern/ }
*/
----------------------------------------------------------
// 查询title以h开头的文档,options里面有i说明大小写不敏感
db.bizQuestion.find( {
title : {$regex : /^h/, $options:'i'}
} )
两种格式的使用场景存在差异,具体可参考上述链接:
{ name: { $in: [ /^acme/i, /^ack/ ] } } // 这里只能使用第二种格式
// 插入--注意size的结构
db.inventory.insertMany( [
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);
// 接着上面的进行查询。
db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } ) // OK
db.inventory.find( { size: { w: 21, h: 14, uom: "cm" } } ) // X, 注意顺序,这里匹配不到任何东西
db.inventory.find( { "size.uom": "in" } )
db.inventory.find( { "size.h": { $lt: 15 } } )
db.inventory.find( { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" } )
其中的字段还可以为一个数组,数组中的数据可以是一个简单的类型,如整数、字符串等,也可以还是一个文档。对于这些情况,其查询方式存在或多或少的差异,可以在需要的时候参考官方文档。
前面查询得到的结果都是全部的字段,如果不需要返回所有的字段,可以通过设置projection来达到目的,projection的解释:
A document given to a query that specifies which fields MongoDB returns in the result set.
其中还包括字段为数组以及数组中的字段为文档的多种情况。
// 初始数据结构
db.inventory.insertMany( [
{ item: "journal", status: "A", size: { h: 14, w: 21, uom: "cm" }, instock: [ { warehouse: "A", qty: 5 } ] },
{ item: "notebook", status: "A", size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "C", qty: 5 } ] },
{ item: "paper", status: "D", size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "A", qty: 60 } ] },
{ item: "planner", status: "D", size: { h: 22.85, w: 30, uom: "cm" }, instock: [ { warehouse: "A", qty: 40 } ] },
{ item: "postcard", status: "A", size: { h: 10, w: 15.25, uom: "cm" }, instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);
// 返回结果显示item,status,不显示_id
db.inventory.find( { status: "A" }, { item: 1, status: 1, _id: 0 } )
// 如果字段的值也是一个文档
db.inventory.find(
{ status: "A" },
{ item: 1, status: 1, "size.uom": 1 }
)
// 字段为数组,数组的类型是文档
db.inventory.find( { status: "A" }, { item: 1, status: 1, "instock.qty": 1 } )
db.books.update(
{ _id: 1 },
{
$inc: { stock: 5 },
$set: {
item: "ABC123",
"info.publisher": "2222",
tags: [ "software" ],
"ratings.1": { by: "xyz", rating: 3 }
}
}
)
-------------------------------------------------------------------
try {
db.restaurant.updateMany(
{ violations: { $gt: 4 } },
{ $set: { "Review" : true } }
);
} catch (e) {
print(e);
}
-------------------------------------------------------------------
// The following operation updates a single document where name: "Central Perk Cafe" with the violations field:
try {
db.restaurant.updateOne(
{ "name" : "Central Perk Cafe" },
{ $set: { "violations" : 3 } }
);
} catch (e) {
print(e);
}
-------------------------------------------------------------------
// The following operation attempts to update the document with name : "Pizza Rat's Pizzaria", while upsert: true :
// 对于这个upsert:true这个参数,update--insert。如果为true并且前面的query没有匹配到,则会进行插入,否则更新。
try {
db.restaurant.updateOne(
{ "name" : "Pizza Rat's Pizzaria" },
{ $set: {"_id" : 4, "violations" : 7, "borough" : "Manhattan" } },
{ upsert: true }
);
} catch (e) {
print(e);
}