注意对于BSON和其他数据,命令是不同的。
同时导入的时候可以选择删除原有collection之后导入,这样可以避免很多问题。
mongodump --uri "mongodb+srv://<your username>:<your password>@<your cluster>.mongodb.net/sample_supplies"
mongoexport --uri="mongodb+srv://<your username>:<your password>@<your cluster>.mongodb.net/sample_supplies" --collection=sales --out=sales.json
mongorestore --uri "mongodb+srv://<your username>:<your password>@<your cluster>.mongodb.net/sample_supplies" --drop dump
mongoimport --uri="mongodb+srv://<your username>:<your password>@<your cluster>.mongodb.net/sample_supplies" --drop sales.json
命名空间:数据库名称
.collection
简单查询:
{"state": "NY"}
{"state": "NY", "city": "ALBANY"}
** 注意查询的时候字段要按照顺序**
- 连接数据库
mongo "mongodb+srv://<username>:<password>@<cluster>.mongodb.net/admin"
- 连贯操作
show dbs
use sample_training
show collections
db.zips.find({"state": "NY"})
在执行find
之后,只会显示出结果集中的20条数据,使用it
命令进行遍历。
因为find
返回一个迭代器。
同时注意其返回数据并不具有顺序性。
- find其他功能
db.zips.find({"state": "NY"}).count()
db.zips.find({"state": "NY", "city": "ALBANY"})
db.zips.find({"state": "NY", "city": "ALBANY"}).pretty()
db.<collection_name>.insert({
...
})
插入多条文档
db.<collection_name>.insert([
{
...
},
{
...
},
...
])
如果插入中间出现错误,则错误文档之后的内容不会插入。如果想继续插入,则要指定参数。
db.<collection_name>.insert([
{
...
},
{
...
},
...
],{ "ordered": false })
如果<collection_name>
所指向的collection不存在,则会同时创建。
同样,如果use <db_name>
所指向db不存在,在插入时会同时创建。
可以使用updateOne
或者updateMany
.
- $inc - increment
- $set
- $unset
- $push
如果查询不到文档,则创建新文档。 其结构会与查询语句的结构相同,可以省去很多查询、创建语句!
删除文档使用deleteOne
or deleteMany
集合则为db.<collection_name>.drop()
数据库不需要删除,当其中没有collection的时候会自动删除
这里需要与$set
等做区分,其用法大概是这样的:
{ <field_name>: {$<opr>: <args>, ...}, ...}
当不添加Query Operators的时候,默认是等于比较。
我们可以理解为给某个field添加“某种”属性!
- $eq
- $ne
- $lt
- $gt
- $lte
- $gte
- $and
- $nor
- $or
{ $<opr>: [{...}, {...}] }
- $not 注意其并不能放在前面直接使用,而要在field中!
{ field: { $not: { <operator-expression> } } }
需要注意的是查询条件的大括号中要以key开头,而不能直接放条件(这样就不是dict了不是吗!)【做题有感】
有时候我们需要比较文档内的属性,比如说给定一个记录开始位置和结束位置的文档collection,我们想要统计其中两个位置相同的文档条目,这就需要比较文档内的情况了。
{
"start pos": "beijing",
"end pos": "taiyuan"
}
对应的查询如下:
db.<collection_name>.find(
{
$expr: {
$eq: ["$start pos", "$end pos"]
}
}
)
下面我们研究一下如何查询数组。
{
{
friend: [ '张三', '李四', '王五']
}
}
是数组,且非空
{ $match: { writers: { $elemMatch: { $exists: true } } }
如果直接查询
{
friend: '张三'
}
将返回所有这个数组中包含这个元素的文档
{
friend: ['张三', '李四']
}
将返回所有内容完全一样的文档(内容、顺序都一样)
-
$all:[...] 用于集合查询
-
$size: num 指定数组的大小
-
$elemMatch 查找数组中满足条件的元素
例如文档中包含成绩数组,我们想看其中大于90分的子文档(当然返回的结果依旧是完整的文档)
{
scores: {
$elemMatch: {
score: {
$gt: 90
}
}
}
}
{
{
jobs: [
{
company: Intel
},
{
company: AMD
}
]
}
}
如果我们想查看第二个工作在AMD的人,可以这样查询
{
'jobs.1.campany': 'AMD'
}
db.<collection_name>.find({MQL}, {projection})
{
_id: 0, // 不显示_id
name: 1 // 显示name
}
如果是数组里面感兴趣的子元素呢?(详情见array query) 没错!与数组查询一样!
{
scores:{
$elemMatch: {
score: {
$gt: 90
}
}
}
}
查询文档已经无法满足我们的需求了。我们希望“创造”一些我们感兴趣的数据;换句话说,我们希望对其进行统计分析。
基础语法:
db.<collection_name>.aggregation([ ...oprs...])
sort({<field_name>: 1 生序 or -1 降序})
limit(限制显示的条数)
pretty()
db.<collection_name>.createIndex({ ...just..like...sort...})
- 分割字符串 split:['$field', '']