root 5 years ago
parent f994f44946
commit cb1cd822a4

@ -131,9 +131,12 @@ find /usr/ -path "*local*" -print # 匹配文件路径或者文件,path后路
# -prune使用这一选项可以使find命令不在当前指定的目录中查找如果同时使用-depth选项那么-prune将被find命令忽略
find . -path "./sk" -prune -o -name "*.txt" -print # 查找当前目录或者子目录下所有.txt文件但是跳过子目录sk
find /usr/sam \( -path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -print # 排除多个目录,-path必须在-prune之前
find /usr/sam ! -path /usr/sam/dir1 # !也可以用来排除目录
# 排除当前目录下A和B子目录找出后缀为log的文件-path必须在-prune之前
find . -type f -name "*.log" -not -path "*/A*" -not -path "*/B*"
find . -type d \( -path ./A -o -path ./B \) -prune -o -print -type f -name "*.log"
# 当前目录及子目录下查找所有以.txt和.pdf结尾的文件
find . -name "*.txt" -o -name "*.pdf" -print
find . \( -name "*.txt" -o -name "*.pdf" \) -print

@ -111,7 +111,7 @@ x\{m,\} # 重复字符x,至少m次'o\{5,\}'匹配至少有5个o的行
x\{m,n\} # 重复字符x至少m次不多于n次'o\{5,10\}'匹配5--10个o的行
\w # 匹配文字和数字字符,即[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符然后是p
\W # \w的反置形式匹配一个或多个非单词字符如点号句号等
\b # 单词锁定符,如: '\bgrep\b'只匹配grep。
\b # 单词锁定符,如: '\bgrep\b'只匹配grep。
# POSIX字符类
@ -196,4 +196,4 @@ grep -A 3 -i "example" demo_text
seq 10 | grep "5" -B 3 # 显示匹配某个结果之前的3行使用 -B 选项
seq 10 | grep "5" -C 3 # 显示匹配某个结果的前三行和后三行,使用 -C 选项
echo -e "a\nb\nc\na\nb\nc" | grep a -A 1 # 如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符
```
```

@ -8,8 +8,8 @@ With no FILE, or when FILE is -, read standard input
-c, --bytes=[-]K 打印每个文件的前K个字节以'-'开头打印每个文件中除最后K个字节以外的所有字节
-n, --lines=[-]K 打印前K行而不是前10行带前缀'-'并打印每个文件中除最后K行外的所有行
-q, --quiet, --silent 不显示包含给定文件名的文件头
-v, --verbose 总是显示包含给定文件名的文件头
-q, --quiet, --silent 不显示包含给定文件名的文件头
-v, --verbose 总是显示包含给定文件名的文件头
K 后面可以跟乘号:
b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,
@ -21,4 +21,4 @@ GB 1000*1000*1000, G 1024*1024*1024, 对于T, P, E, Z, Y 同样适用
```bash
head -1 file # 显示file文件第一行
head -n1 /etc/issue # 查看操作系统版本,不一定每个系统都能看到
```
```

@ -51,8 +51,7 @@
## 实例
```bash
ls -lrt # 列出当前目录可见文件详细信息并以时间倒序排列
ls -hl # 列出详细信息并以可读大小显示文件大小
ls -hlrt --time-style="+%Y-%m-%d %H:%M" # 列出当前目录可见文件详细信息并以格式化的时间倒序排列
ls -al # 列出所有文件(包括隐藏)的详细信息
ls ??R* # 列出任意两个字符开始,接着跟R,后面任何字符的文件
ls log.[0-9]* # 匹配log+任何数字+任意字符的文件

@ -54,7 +54,6 @@ Defaults in parentheses; comma-separated set (s) items; dash-separated ranges.
names select named files or files on named file systems
Anyone can list all files; /dev warnings disabled; kernel ID check disabled.
```
## 详解

@ -1,7 +1,4 @@
make
===
GNU的工程化编译工具
# **make**
## 说明
@ -9,13 +6,7 @@ GNU的工程化编译工具
## 选项
```
make(选项)(参数)
```
```
```markdown
-f指定“makefile”文件
-i忽略命令执行返回的出错信息
-s沉默模式在执行之前不输出相应的命令行信息
@ -25,27 +16,15 @@ make(选项)(参数)
-qmake操作将根据目标文件是否已经更新返回"0"或非"0"的状态信息
-p输出所有宏定义和目标文件描述
-dDebug模式输出有关文件和检测时间的详细信息
```
Linux下常用选项与Unix系统中稍有不同下面是不同的部分
```
-c dir在读取 makefile 之前改变到指定的目录dir
-I dir当包含其他 makefile文件时利用该选项指定搜索目录
-hhelp文挡显示所有的make选项
-w在处理 makefile 之前和之后,都显示工作目录
```
### 参数
目标:指定编译目标
### 知识扩展
无论是在linux 还是在Unix环境 中make都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件我们都经常要用到make或make install。利用make工具我们可以将大型的开发项目分解成为多个更易于管理的模块对于一个包括几百个源文件的应用程序使用make和 makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系
而且如此多的源文件如果每次都要键入gcc命令进行编译的话那对程序员 来说简直就是一场灾难。而make工具则可自动完成编译工作并且可以只对程序员在上次编译后修改过的部分进行编译
因此有效的利用make和 makefile工具可以大大提高项目开发的效率。同时掌握make和makefile之后您也不会再面对着Linux下的应用软件手足无措了
## 知识扩展

@ -10,11 +10,8 @@
用法pr [选项] [文件]
Mandatory arguments to long options are mandatory for short options too.
+首页[:末页], --pages=首页[:末页]
在指定的首页/末页处开始/停止打印
-列数, --columns=列数
输出指定的列数。如果指定了-a 选项,则从上到下列印
程序会自动在每一页均衡每列占用的行数
+首页[:末页], --pages=首页[:末页] 在指定的首页/末页处开始/停止打印
-列数, --columns=列数 输出指定的列数。如果指定了-a 选项,则从上到下列印 程序会自动在每一页均衡每列占用的行数
-a, --across 设置每列从上到下输出,配合"-列数"选项一起使用
-c, --show-control-chars
使用头标(^G)和八进制反斜杠标记

@ -1,7 +1,4 @@
restorecon
===
恢复文件的安全上下文
# restorecon
## 说明
@ -13,7 +10,7 @@ restorecon
restorecon [-iFnrRv] [-e excludedir ] [-o filename ] [-f filename | pathname...]
```
```
-i忽略不存在的文件
@ -63,6 +60,7 @@ type=AVC msg=audit(1378974214.610:465): avc: denied { open } for pid=2359 com
/*使用restorecon来恢复网页主目录中所有文件的SELinux配置信息(如果目标为一个目录,可以添加-R参数递归)*/
[root@jsdig.com html]# restorecon -R /var/www/html/
```
# 测试publickeys免密登录权限authorized_keys文件
restorecon -r -vv .ssh/authorized_keys
```

@ -11,10 +11,10 @@
```markdown
用法: sed [选项] {脚本(如果没有其他脚本)} [输入文件]
-n, --quiet, --silent 取消自动打印模式空间
-e 脚本, --expression=脚本 添加“脚本”到程序的运行列表,指定script处理文本
-f 脚本文件, --file=脚本文件 添加“脚本文件”到程序的运行列表,指定脚本文件处理文本
--follow-symlinks 直接修改文件时跟随软链接
-n, --quiet, --silent 取消自动打印模式空间
-e 脚本, --expression=脚本 添加“脚本”到程序的运行列表,指定script处理文本
-f 脚本文件, --file=脚本文件 添加“脚本文件”到程序的运行列表,指定脚本文件处理文本
--follow-symlinks 直接修改文件时跟随软链接
-i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if SUFFIX supplied)
-c, --copy use copy instead of rename when shuffling files in -i mode
-b, --binary 什么也不做用于与WIN32/CYGWIN/MSDOS/EMX兼容(二进制模式下的打开文件(CR+LF换行符未被特殊对待))

@ -47,6 +47,8 @@ dd if=/dev/zero bs=100k count=1 of=date.file # 生成一个大小为100KB的
split -b 10k date.file # 使用split命令将上面创建的date.file文件分割成大小为10KB的小文件
split -b 10k date.file -d -a 3 # file分割成多个后缀文件若想用数字后缀可使用-d参数同时可使用-a length来指定后缀长度
split -b 10k date.file -d -a 3 split_file # 为分割后的文件指定文件名的前缀
split -l 10 date.file # 使用-l选项根据文件的行数来分割文件例如把文件分割成每个包含10行的小文件
# 使用-l选项根据文件的行数来分割文件例如把文件分割成每个包含100行的小文件
split -l 100 test.sql -d -a 2 --additional-suffix=.sql test
```

@ -1,7 +1,4 @@
stat
===
用于显示文件的状态信息
# **stat**
## 说明
@ -9,13 +6,7 @@ stat
## 选项
```
stat(选项)(参数)
```
```
```markdown
-L支持符号连接
-f显示文件系统状态而非文件状态
-t以简洁方式输出信息
@ -23,35 +14,8 @@ stat(选项)(参数)
--version显示指令的版本信息
```
### 参数
文件:指定要显示信息的普通文件或者文件系统对应的设备文件名
## 实例
```
[root@localhost ~]# ls -l myfile
-rw-r--r-- 1 root root 0 2010-10-09 myfile
[root@localhost ~]# stat myfile
file: “myfile”
Size: 0 Blocks: 8 IO Block: 4096 一般空文件
Device: fd00h/64768d Inode: 194805815 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2010-12-12 12:22:35.000000000 +0800
Modify: 2010-10-09 20:44:21.000000000 +0800
Change: 2010-10-09 20:44:21.000000000 +0800
[root@localhost ~]# stat -f myfile
File: "myfile"
id: 0 Namelen: 255 type: ext2/ext3
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 241555461 free: 232910771 Available: 220442547
Inodes: Total: 249364480 Free: 249139691
[root@localhost ~]# stat -t myfile
myfile 0 8 81a4 0 0 fd00 194805815 1 0 0 1292127755 1286628261 1286628261 4096
```bash
```

@ -268,6 +268,32 @@ tar -cf all.tar *.jpg # 这条命令是将所有.jpg的文件打成一个
tar -rf all.tar *.gif # 这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思
tar -uf all.tar logo.gif # 这条命令是更新原来tar包all.tar中logo.gif文件-u是表示更新文件的意思
tar -tf all.tar # 这条命令是列出all.tar包中所有文件-t是列出文件的意思
# 将文件全部打包成tar包
tar -cvf log.tar log2012.log # 仅打包,不压缩!
tar -zcvf log.tar.gz log2012.log # 打包后,以 gzip 压缩
tar -jcvf log.tar.bz2 log2012.log # 打包后,以 bzip2 压缩
tar -cf - foo/ | xz -9 -c - > foo.tar.xz # 目录foo打包后以xz压缩
tar -zxvf log.tar.gz # 将tar包解压缩
tar -ztvf log.tar.gz # 查阅上述tar包内有哪些文件选项z表示由gzip压缩的
tar -zxvf /opt/soft/test/log30.tar.gz log2013.log # 只将tar内的部分文件解压出来
tar -zcvpf log.tar.gz archive-$(date +%Y%m%d).log # 文件备份下来,并且保存其权限;这个`-p`的属性
tar -c dir/ | gzip | gpg -c | ssh user@remote 'dd of=dir.tar.gz.gpg' # 将目录dir/压缩打包并放到远程机器上
tar -c /dir/to/copy | cd /where/to/ && tar -x -p # 拷贝目录copy/到目录/where/to/并保持文件属性
tar -c /dir/to/copy | ssh -C user@remote 'cd /where/to/ && tar -x -p' # 拷贝目录copy/到远程目录/where/to/并保持文件属性
find dir/ -name '*.txt' | tar -c --files-from=- | bzip2 > dir_txt.tar.bz2 # 将目录dir及其子目录所有txt文件打包并用bzip2压缩
tar --exclude=scf/service -zcvf scf.tar.gz scf/* # 备份文件夹内容时排除部分文件
tar -xvf log.tar.gz --wildcards "*.txt" # 解压以txt结尾的文件
tar -czwf log.tar.gz /dir/* # 将dir目录下所有文件压缩w选项表示每个文件添加到存档之前要求确认
tar -cvWf log.tar /dir/ # 验证压缩包中的文件W选项表示验证
tar -rvf log.tar.gz test.log # 将test.log文件添加到已存在的压缩包内
tar -N "2012/11/13" -zcvf log17.tar.gz test
# 其实最简单的使用 tar就只要记忆底下的方式即可
tar -jcvf filename.tar.bz2 # 要被压缩的文件或目录名称
tar -jtvf filename.tar.bz2 # 要查询的压缩文件
tar -jxvf filename.tar.bz2 -C dir # 解压缩到dir目录
```
```markdown
@ -346,30 +372,3 @@ jar -cvfm [目标文件名].jar META-INF/MANIFEST.MF [原文件名/目录名]
这个7z解压命令支持rar格式
7z x [原文件名].rar
```
```bash
# 将文件全部打包成tar包
tar -cvf log.tar log2012.log # 仅打包,不压缩!
tar -zcvf log.tar.gz log2012.log # 打包后,以 gzip 压缩
tar -jcvf log.tar.bz2 log2012.log # 打包后,以 bzip2 压缩
tar -zxvf log.tar.gz # 将tar包解压缩
tar -ztvf log.tar.gz # 查阅上述tar包内有哪些文件选项z表示由gzip压缩的
tar -zxvf /opt/soft/test/log30.tar.gz log2013.log # 只将tar内的部分文件解压出来
tar -zcvpf log.tar.gz archive-$(date +%Y%m%d).log # 文件备份下来,并且保存其权限;这个`-p`的属性
tar -c dir/ | gzip | gpg -c | ssh user@remote 'dd of=dir.tar.gz.gpg' # 将目录dir/压缩打包并放到远程机器上
tar -c /dir/to/copy | cd /where/to/ && tar -x -p # 拷贝目录copy/到目录/where/to/并保持文件属性
tar -c /dir/to/copy | ssh -C user@remote 'cd /where/to/ && tar -x -p' # 拷贝目录copy/到远程目录/where/to/并保持文件属性
find dir/ -name '*.txt' | tar -c --files-from=- | bzip2 > dir_txt.tar.bz2 # 将目录dir及其子目录所有txt文件打包并用bzip2压缩
tar --exclude=scf/service -zcvf scf.tar.gz scf/* # 备份文件夹内容时排除部分文件
tar -xvf log.tar.gz --wildcards "*.txt" # 解压以txt结尾的文件
tar -czwf log.tar.gz /dir/* # 将dir目录下所有文件压缩w选项表示每个文件添加到存档之前要求确认
tar -cvWf log.tar /dir/ # 验证压缩包中的文件W选项表示验证
tar -rvf log.tar.gz test.log # 将test.log文件添加到已存在的压缩包内
tar -N "2012/11/13" -zcvf log17.tar.gz test
# 其实最简单的使用 tar就只要记忆底下的方式即可
tar -jcvf filename.tar.bz2 # 要被压缩的文件或目录名称
tar -jtvf filename.tar.bz2 # 要查询的压缩文件
tar -jxvf filename.tar.bz2 -C dir # 解压缩到dir目录
```

@ -25,6 +25,3 @@ umask u=, g=w, o=rwx
umask -s # 检查新创建文件的默认权限
```

@ -83,7 +83,7 @@ IP)
--prefer-family=地址族 首先连接至指定家族IPv6IPv4
的地址
--user=用户 将 ftp 和 http 的用户名均设置为
--password=密码 将 ftp 和 http 的密码均设置为 <
--password=密码 将 ftp 和 http 的密码均设置为
--ask-password 提示输入密码
--use-askpass=命令 指定用于请求用户名和密码的凭据管
如果没有提供指定命令,程序将使
@ -181,7 +181,7 @@ WARC 选项:
递归下载:
-r, --recursive 指定递归下载
-l, --level=数字 最大递归深度 (inf 或 0 代表无限制,即全部下载)
-l, --level=数字 最大递归深度 (inf 或 0 代表无限制,即全部下载)
--delete-after 下载完成后删除本地文件
-k, --convert-links 让下载得到的 HTML 或 CSS 中的链接指向本地文件
--convert-file-only 只转换 URL 的文件部分(一般叫做“基础名”/basename

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,260 @@
# 整合官方和常用示例
# https://api.mongodb.com/python/current/py-modindex.html
from pymongo import MongoClient
from pymongo import InsertOne, DeleteMany, ReplaceOne, UpdateOne
from bson.objectid import ObjectId
from bson.son import SON
from bson import json_util, CodecOptions
import datetime
from pprint import pprint
import pymongo
from bson.code import Code
import urllib.parse
import ssl
from pymongo import errors
from pymongo import WriteConcern
import pytz
import gridfs
import multiprocessing
client = MongoClient(host="192.168.2.15", port=27017)
all_databases = client.list_database_names()
pprint(all_databases)
# using dictionary style access
db = client["AdminConfigDB"]
all_collections = db.collection_names()
pprint(all_collections)
# using nomal style
collection = db.arc_AdminConf
# pprint(collection.find_one({}))
# for collection in collection.find({"flush":False}).sort("productId"):
# pprint(collection)
# 以product_id升序创建索引
# create_index = collection.create_index([('product_id', pymongo.ASCENDING)], unique=True)
# 打印集合索引信息
# pprint(sorted(list(collection.index_information())))
db2 = client.TestData
collection2 = db2.things
# result = collection2.insert_many([{"x": 1, "tags": ["dog", "cat"]},
# {"x": 2, "tags": ["cat"]},
# {"x": 2, "tags": ["mouse", "cat", "dog"]},
# {"x": 3, "tags": []}])
# pprint(result.inserted_ids)
# Aggregation Framework示例
# pipeline = [
# {"$unwind": "$tags"},
# {"$group": {"_id": "$tags", "count": {"$sum": 1}}},
# {"$sort": SON([("count", -1), ("_id", -1)])}]
# pprint(list(collection2.aggregate(pipeline)))
# Map/Reduce示例
# mapper = Code(
# """
# function () {
# this.tags.forEach(function(z) {
# emit(z, 1);
# });
# }
# """
# )
# reducer = Code(
# """
# function (key, values) {
# var total = 0;
# for (var i = 0; i < values.length; i++) {
# total += values[i];
# }
# return total;
# }
# """
# )
# result = collection2.map_reduce(mapper, reducer, "map_reduce_result")
# for doc in result.find():
# pprint(doc)
# results = collection2.map_reduce(
# mapper, reducer, "myresults", query={"x": {"$lt": 2}})
# for doc in results.find():
# pprint(doc)
# 认证示例
# username = urllib.parse.quote_plus('user')
# password = urllib.parse.quote_plus('pass/word')
# client = MongoClient('mongodb://%s:%s@127.0.0.1' % (username, password))
# version3.7支持SCRAM-SHA-256
# client = MongoClient('example.com',
# username='user',
# password='password',
# authSource='the_database',
# authMechanism='SCRAM-SHA-256')
# mongodb uri连接方式
# uri = "mongodb://user:password@example.com/?authSource=the_database&authMechanism=SCRAM-SHA-256"
# client = MongoClient(uri)
# mongodb-x509认证
# client = MongoClient('example.com',
# username="<X.509 derived username>",
# authMechanism="MONGODB-X509",
# ssl=True,
# ssl_certfile='/path/to/client.pem',
# ssl_cert_reqs=ssl.CERT_REQUIRED,
# ssl_ca_certs='/path/to/ca.pem')
# 复制一个数据库
# client.admin.command('copydb', fromdb='src_db_name', todb='dst_db_name', fromhost='src_host_ip')
# 批量插入
# _id对于大多数高写入量的应用程序而言对于插入的文档本身没有_id字段时在插入时自动创建代价较高。inserted_ids表示按提供_id的顺序插入文档
# collection2.insert_many([{'x': i} for i in range(10000)]).inserted_ids
# print(collection2.count_documents({}))
# 批量删除
# collection2.delete_many({'x':{"$gte": 3}})
# bulk write混合批量写入
# 添加write_concern 写关注
# collection2 = db2.get_collection('things', write_concern=WriteConcern(w=2, wtimeout=10))
# try:
# result = collection2.bulk_write([
# DeleteMany({}), # Remove all documents from the previous example.
# InsertOne({'_id': 1}),
# InsertOne({'_id': 2}),
# InsertOne({'_id': 3}),
# UpdateOne({'_id': 1}, {'$set': {'foo': 'bar'}}),
# UpdateOne({'_id': 4}, {'$inc': {'j': 1}}, upsert=True),
# ReplaceOne({'j': 1}, {'j': 2})])
# except errors.BulkWriteError as bwe:
# pprint(bwe.details)
# pprint(result.bulk_api_result)
# 日期时间和时区(mongodb默认假定时间以UTC)
# result = db2.objects.insert_one({"last_modified": datetime.datetime.utcnow()})
# tz_aware选项该选项启用“感知” datetime.datetime对象.即知道其所在时区的日期时间
# result = db2.demo.insert_one( {'date': datetime.datetime(2019, 11, 28, 14, 0, 0)})
# db2.demo.find_one()['date']
# datetime.datetime(2019, 11, 28, 14, 0)
# options = CodecOptions(tz_aware=True)
# db2.get_collection('demo', codec_options=options).find_one()['date']
# 使用时区保存日期时间
# 存储datetime.datetime指定时区的对象即tzinfo属性不是None时PyMongo会将这些日期时间自动转换为UTC
# pacific = pytz.timezone('Asia/Shanghai')
# aware_datetime = pacific.localize( datetime.datetime(2019, 11, 28, 14, 0, 0))
# result = db2.demo.insert_one({"date_tz": aware_datetime})
# datetime.datetime(2019, 11, 28, 14, 0)
# 地理空间索引示例
# https://api.mongodb.com/python/current/examples/geo.html
# GridFS示例
# 每个GridFS实例都是使用特定Database实例创建的并将在特定实例上运行
# db = MongoClient().gridfs_example
# fs = gridfs.GridFS(db)
# 将数据写入gridfs,put()在GridFS中创建一个新文件并返回文件文档"_id"密钥的值
# data = fs.put(b"hello world")
# get()方法取回文件内容,get()返回类似文件对象调用read()方法获取文件内容
# content = fs.get(data).read()
# 除了将str作为GridFS文件放置外还可以放置任何类似文件的对象带有read() 方法的对象。GridFS将自动处理按块大小的段读取文件。还可以将其他属性作为关键字参数添加到文件中
# b = fs.put(fs.get(a), filename="foo", bar="baz")
# out = fs.get(b)
# out.read()
# out.filename
# out.bar
# out.upload_date
# 可拖尾游标,客户端用尽游标中所有结果后自动关闭游标,但对于上限集合(copped集合)可以使用可拖尾的游标
# https://api.mongodb.com/python/current/examples/tailable.html
# 自定义类型
"""
https://api.mongodb.com/python/current/examples/custom_type.html
为了编码自定义类型必须首先为该类型定义类型编解码器
用户在定义类型编解码器时必须从以下基类中进行选择
* TypeEncoder将其子类化以定义将自定义Python类型编码为已知BSON类型的编解码器用户必须实现 python_type属性/属性和transform_python方法
* TypeDecoder将其子类化以定义将特定BSON类型解码为自定义Python类型的编解码器用户必须实现bson_type属性/属性和transform_bson方法
* TypeCodec此方法的子类以定义可以对自定义类型进行编码和解码的编解码器用户必须实现 python_type和bson_type属性/属性以及 transform_python和transform_bson方法
自定义类型的类型编解码器仅需要定义如何将 Decimal实例转换为 Decimal128实例反之亦然
from bson.decimal128 import Decimal128
from bson.codec_options import TypeCodec
class DecimalCodec(TypeCodec):
python_type = Decimal # the Python type acted upon by this type codec
bson_type = Decimal128 # the BSON type acted upon by this type codec
def transform_python(self, value):
# Function that transforms a custom type value into a type that BSON can encode
return Decimal128(value)
def transform_bson(self, value):
# Function that transforms a vanilla BSON type value into our custom type
return value.to_decimal()
decimal_codec = DecimalCodec()
# 开始对自定义类型对象进行编码和解码之前我们必须首先将相应的编解码器告知PyMongo。这是通过创建一个TypeRegistry实例来完成
# 以使用任意数量的类型编解码器实例化类型注册表。一旦实例化,注册表是不可变的,将编解码器添加到注册表的唯一方法是创建一个新的注册表
from bson.codec_options import TypeRegistry
type_registry = TypeRegistry([decimal_codec])
# 使用CodecOptions实例定义一个实例type_registry并使用它来获取一个Collection理解Decimal数据类型的对象
未完待续......
"""
# mongodb跨数据库查询、跨表(集合)、跨服务器查询都可根据以下方式修改
# 查询data下product集合以条件gaId为1不重复的paId
# 使用此paId作为查询pa下pa_info集合以条件pa_id等于paId且v为1的文档
# data = client.data
# product = data.product
# pa = client.pa
# pa_info = pa.pa_info
# pipeline = [
# {"$match": {"gaId": 1}},
# {"$sort": {"paId": -1}},
# {"$group": {"_id": "$paId"}},
# {"$project": {"paId": 1.0}},
# ]
# cursor = pa_info.aggregate(pipeline, allowDiskUse=False)
# try:
# for doc in cursor:
# doc_value = doc['_id']
# pa_result = pa_info.find({"pa_id": doc_value, "v":1})
# for pa_doc in pa_result:
# # 查询到的结果写入到其他集合
# result_insert = collection2.insert_many([pa_doc])
# # pass
# finally:
# client.close()
# 父进程和每个子进程必须创建自己的MongoClient实例
# Each process creates its own instance of MongoClient.
# def func():
# db = pymongo.MongoClient().mydb
# # Do something with db.
# proc = multiprocessing.Process(target=func)
# proc.start()

@ -0,0 +1,2 @@
username = 'admin'
secret = 'admin'

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save