mongodb db.collection.remove用法

 

对于db.collection.remove需要加入加入一个query才能正常运行,否则仅仅运行remove()将会报错,例如:

 

> db.dbdao_stuff.insert({"_id":1,"a":1,"b":1});
WriteResult({ "nInserted" : 1 })
> 
> db.dbdao_stuff.insert({"_id":2,"a":2,"b":3});
WriteResult({ "nInserted" : 1 })
> db.dbdao_stuff.insert({"_id":3,"a":3,"b":6});
WriteResult({ "nInserted" : 1 })
> db.dbdao_stuff.insert({"_id":4,"a":4,"b":10});
WriteResult({ "nInserted" : 1 })
> db.dbdao_stuff.insert({"_id":5,"a":5,"b":15});
WriteResult({ "nInserted" : 1 })
> 
> db.dbdao_stuff.find();
{ "_id" : 1, "a" : 1, "b" : 1 }
{ "_id" : 2, "a" : 2, "b" : 3 }
{ "_id" : 3, "a" : 3, "b" : 6 }
{ "_id" : 4, "a" : 4, "b" : 10 }
{ "_id" : 5, "a" : 5, "b" : 15 }


db.dbdao_stuff.remove();
2015-05-05T21:20:21.275+0800 E QUERY    Error: remove needs a query
    at Error ()
    at DBCollection._parseRemove (src/mongo/shell/collection.js:305:32)
    at DBCollection.remove (src/mongo/shell/collection.js:328:23)
    at (shell):1:16 at src/mongo/shell/collection.js:305


如上语句 仅仅运行 db.dbdao_stuff.remove(); 会报错 Error: remove needs a query
> db.dbdao_stuff.remove({});
WriteResult({ "nRemoved" : 5 })

这时候加入 remove({}); 即可删除所有document

 

 

db.collection.remove有以下2种用法:

 

db.collection.remove(
 <query>,
 <justOne>
)


或者 

db.collection.remove(
 <query>,
 {
 justOne: <boolean>,
 writeConcern: <document>
 }
)

justone=>TRUE 时仅仅删除一条符合条件的document , writeConcern是关于safe write的。

MongoDB $unset重置某个field

对于已经有值的field,在mongodb中可以使用$unset操作符来重置该field。

http://docs.mongodb.org/manual/reference/operator/update/unset/

具体语法如下:

 

{ $unset: { <field1>: "", ... } }
例如
db.products.update(
 { sku: "unknown" },
 { $unset: { quantity: "", instock: "" } }
)

 

 

具体使用的例子:

db.dbdao_sample.insert({"_id":3,"a":7,"c":[3,4,7,-1,-1]});


> db.dbdao_sample.update({"_id":3},{"$unset" : {"c":""}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.dbdao_sample.find();
{ "_id" : 3, "a" : 7 }


db.dbdao_sample.insert({"_id":4,"a":7,"c":[3,4,7,-1,-1]});


db.dbdao_sample.update({"_id":4},{"$remove" : {"c":""}});

没有$remove这个操作符

> db.dbdao_sample.update({"_id":4},{"c": {"$delete":true }});
2015-05-05T20:38:33.817+0800 E QUERY Error: field names cannot start with $ [$delete]
 at Error (<anonymous>)
 at DBCollection._validateForStorage (src/mongo/shell/collection.js:161:19)
 at DBCollection._validateForStorage (src/mongo/shell/collection.js:165:18)
 at DBCollection._validateUpdateDoc (src/mongo/shell/collection.js:388:14)
 at Object.findOperations.updateOne (src/mongo/shell/bulk_api.js:675:20)
 at DBCollection.update (src/mongo/shell/collection.js:455:22)
 at (shell):1:17 at src/mongo/shell/collection.js:161

> db.dbdao_sample.update({"_id":4},{"c":null});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> 
> db.dbdao_sample.find({"_id":4});
{ "_id" : 4, "c" : null }


> db.dbdao_sample.update({"_id":4},{"c":1});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.dbdao_sample.find({"_id":4});
{ "_id" : 4, "c" : 1 }


mongodb $all操作符

$all操作符帮助选择collection中field是array类型的,且该array包含所有指定的元素的document。 若使用$all操作符,语法如下:

 

{ <field>: { $all: [ <value1> , <value2> ... ] } }

 

使用例子如下

 

> db.dbdao_col.insert({_id:1,"a":1,"b":[3]});
WriteResult({ "nInserted" : 1 })
> db.dbdao_col.insert({_id:11,"a":"5","b":[5,3,7]});
WriteResult({ "nInserted" : 1 })
> db.dbdao_col.insert({_id:111,"a": 1 ,"b":[3,5]});
WriteResult({ "nInserted" : 1 })
> db.dbdao_col.insert({_id:12,"a": "5" ,"b":["alpha",5]});
WriteResult({ "nInserted" : 1 })

> db.dbdao_col.find();
{ "_id" : 1, "a" : 1, "b" : [ 3 ] }
{ "_id" : 11, "a" : "5", "b" : [ 5, 3, 7 ] }
{ "_id" : 111, "a" : 1, "b" : [ 3, 5 ] }
{ "_id" : 12, "a" : "5", "b" : [ "alpha", 5 ] }


> db.dbdao_col.find({"b": { "$all" : [5,3]}});
{ "_id" : 11, "a" : "5", "b" : [ 5, 3, 7 ] }
{ "_id" : 111, "a" : 1, "b" : [ 3, 5 ] }
> 
> 
> db.dbdao_col.find({"b": { "$all" : [3,5]}});
{ "_id" : 11, "a" : "5", "b" : [ 5, 3, 7 ] }
{ "_id" : 111, "a" : 1, "b" : [ 3, 5 ] }

> db.dbdao_col.insert({_id:1,"a":1,"b":[3]});
WriteResult({ "nInserted" : 1 })
> db.dbdao_col.insert({_id:11,"a":"5","b":[5,3,7]});
WriteResult({ "nInserted" : 1 })
> db.dbdao_col.insert({_id:111,"a": 1 ,"b":[3,5]});
WriteResult({ "nInserted" : 1 })
> db.dbdao_col.insert({_id:12,"a": "5" ,"b":["alpha",5]});
WriteResult({ "nInserted" : 1 })

> db.dbdao_col.find();
{ "_id" : 1, "a" : 1, "b" : [ 3 ] }
{ "_id" : 11, "a" : "5", "b" : [ 5, 3, 7 ] }
{ "_id" : 111, "a" : 1, "b" : [ 3, 5 ] }
{ "_id" : 12, "a" : "5", "b" : [ "alpha", 5 ] }


> db.dbdao_col.find({"b": { "$all" : [5,3]}});
{ "_id" : 11, "a" : "5", "b" : [ 5, 3, 7 ] }
{ "_id" : 111, "a" : 1, "b" : [ 3, 5 ] }
> 
> 
> db.dbdao_col.find({"b": { "$all" : [3,5]}});
{ "_id" : 11, "a" : "5", "b" : [ 5, 3, 7 ] }
{ "_id" : 111, "a" : 1, "b" : [ 3, 5 ] }

 

 

$all 其实等价于$and操作符的这种用法,但是写起来太繁琐:

 

> db.dbdao_col.find({ $and:[ {"b":3},{"b":5}]});
{ "_id" : 11, "a" : "5", "b" : [ 5, 3, 7 ] }
{ "_id" : 111, "a" : 1, "b" : [ 3, 5 ] }


> db.dbdao_col.find({ $and:[ {"b":5},{"b":3}]});
{ "_id" : 11, "a" : "5", "b" : [ 5, 3, 7 ] }
{ "_id" : 111, "a" : 1, "b" : [ 3, 5 ] }

MongoDB db.collection.remove()方法

mongodb中删除document采用remove方法,

http://docs.mongodb.org/manual/reference/method/db.collection.remove/

db.collection.remove(),从一个collection中移除对应的document。db.collection.remove()可以有2种用法:

 

 

db.collection.remove(
 <query>,
 <justOne>
)

justone是布尔类型,是可选的参数,来保证只删除一个document; 默认为false即删除所有符合要求的document>

从版本2.6开始加入了新的语法:

db.collection.remove(
   ,
   {
     justOne: ,
     writeConcern: 
   }
)

 

writeConcern 关于safe write。

下面的是db.collection.remove()的使用例子

 

其中new Date方法用来返回一个mongoldb中的ISOdate类型

 

 

ac:~ maclean$ mongo
MongoDB shell version: 3.0.2
connecting to: test
> 
> 
> db.dbdao_email.insert({email_title:"dbdao email!",date: new Date("1999-01-01")});
WriteResult({ "nInserted" : 1 })
> 
> 
> 
> 
> db.dbdao_email.find();
{ "_id" : ObjectId("554766d2e90479237b67c782"), "email_title" : "dbdao email!", "date" : ISODate("1999-01-01T00:00:00Z") }
> db.dbdao_email.insert({email_title:"dbdao email!",date: new Date("1999-02-01")});
WriteResult({ "nInserted" : 1 })
> db.dbdao_email.insert({email_title:"dbdao email!",date: new Date("1999-02-01")});
WriteResult({ "nInserted" : 1 })
> db.dbdao_email.insert({email_title:"dbdao email!",date: new Date("1999-02-01")});
WriteResult({ "nInserted" : 1 })
> db.dbdao_email.insert({email_title:"dbdao email!",date: new Date("2001-02-01")});
WriteResult({ "nInserted" : 1 })
> db.dbdao_email.insert({email_title:"dbdao email!",date: new Date("2002-02-01")});
WriteResult({ "nInserted" : 1 })
> 
> 
> db.dbdao_email.find({date:{ $lt : new Date("2000-01-01")}});
{ "_id" : ObjectId("554766d2e90479237b67c782"), "email_title" : "dbdao email!", "date" : ISODate("1999-01-01T00:00:00Z") }
{ "_id" : ObjectId("554766e4e90479237b67c783"), "email_title" : "dbdao email!", "date" : ISODate("1999-02-01T00:00:00Z") }
{ "_id" : ObjectId("554766e5e90479237b67c784"), "email_title" : "dbdao email!", "date" : ISODate("1999-02-01T00:00:00Z") }
{ "_id" : ObjectId("554766e6e90479237b67c785"), "email_title" : "dbdao email!", "date" : ISODate("1999-02-01T00:00:00Z") }
> 
> db.dbdao_email.find();
{ "_id" : ObjectId("554766d2e90479237b67c782"), "email_title" : "dbdao email!", "date" : ISODate("1999-01-01T00:00:00Z") }
{ "_id" : ObjectId("554766e4e90479237b67c783"), "email_title" : "dbdao email!", "date" : ISODate("1999-02-01T00:00:00Z") }
{ "_id" : ObjectId("554766e5e90479237b67c784"), "email_title" : "dbdao email!", "date" : ISODate("1999-02-01T00:00:00Z") }
{ "_id" : ObjectId("554766e6e90479237b67c785"), "email_title" : "dbdao email!", "date" : ISODate("1999-02-01T00:00:00Z") }
{ "_id" : ObjectId("554766ece90479237b67c786"), "email_title" : "dbdao email!", "date" : ISODate("2001-02-01T00:00:00Z") }
{ "_id" : ObjectId("554766efe90479237b67c787"), "email_title" : "dbdao email!", "date" : ISODate("2002-02-01T00:00:00Z") }
> 
> db.dbdao_email.find({date:{ $lt : new Date("2000-01-01")}});
{ "_id" : ObjectId("554766d2e90479237b67c782"), "email_title" : "dbdao email!", "date" : ISODate("1999-01-01T00:00:00Z") }
{ "_id" : ObjectId("554766e4e90479237b67c783"), "email_title" : "dbdao email!", "date" : ISODate("1999-02-01T00:00:00Z") }
{ "_id" : ObjectId("554766e5e90479237b67c784"), "email_title" : "dbdao email!", "date" : ISODate("1999-02-01T00:00:00Z") }
{ "_id" : ObjectId("554766e6e90479237b67c785"), "email_title" : "dbdao email!", "date" : ISODate("1999-02-01T00:00:00Z") }
> 
> db.dbdao_email.remove({date:{ $lt : new Date("2000-01-01")}})
WriteResult({ "nRemoved" : 4 })
> db.dbdao_email.find({date:{ $lt : new Date("2000-01-01")}});
> db.dbdao_email.find();
{ "_id" : ObjectId("554766ece90479237b67c786"), "email_title" : "dbdao email!", "date" : ISODate("2001-02-01T00:00:00Z") }
{ "_id" : ObjectId("554766efe90479237b67c787"), "email_title" : "dbdao email!", "date" : ISODate("2002-02-01T00:00:00Z") }

有的时候为了减少存储使用,用户决定删除collection中的部分记录,则可以用db.emails.remove({“date”: {“lt”: new Date(“2001-01-01”)}})

用于Linux上数据及被删除分区恢复的5个最佳数据恢复工具


 

—————-
什么是数据恢复(Data Recovery)?

数据恢复是当数据不能正常访问时,从损坏/报错/讹误或不可访问的磁盘介质上进行数据拯救的一个过程。
被拯救的数据通常存放在存储介质如内部或外部磁盘,SSD, USB闪存,CD, DVD, RAID和其它电子存储设备中。
当存储设备出现物理损坏或文件系统出现逻辑损坏导致相关文件系统不能被mount到OS上,你就需要考虑进行恢复。

最通常需要数据恢复的原因是由于操作系统错误。当系统未能boot起来,那么我们需要立刻保存或恢复相关重要数据。

—————-
5个最佳的Linux数据恢复工具 

如果你正在使用Linux,而你又由于某些物理或逻辑损坏的原因需要进行数据恢复,那么你会发现有很多恢复数据的工具可选。
为了不使我们在其中纠结迷失,我从中挑出了5个Linux上最好的数据恢复工具。
文中你可以选择其中一个来进行恢复而不必在一大堆的Linux数据恢复工具中寻找。

—————-
5. SystemRescureCD

SystemRescureCD是基于Gentoo Linux平台工具,当系统在一次奔溃后受到损坏,它可以用于作为启用光盘或USB驱动来修复那些无法启动的情况。
此工具提供了非常多拯救数据,建立编辑分区,磁盘测试和其他特性:

特性:

  • 使用GNU Parted和GParted进行磁盘分区和分区大小改变,包括了FAT32和NTFS格式
  • 使用fdisk编辑磁盘分区表
  • 使用PartImage磁盘镜像软件拷贝被使用过的扇区
  • 使用TestDisk来恢复丢失的分区并使用PhotoRec恢复丢失的数据
  • 使用FSArchiver系统工具可使你对文件系统中的内容进行压缩保存。
  • CD和DVD烧录:dvd+rw-tools工具
  • 两个bootloader: GRUB和SYSLINUX
  • 提供浏览器: Firefox, Midori, ELinks
  • 文件管理器:emelFM2
  • 具有归档和非归档能力
  • 文件系统工具:文件系统建立,删除,重定义大小,移动支持多种文件格式, 除了FAT32和Mac OS HFS还包括NTFS读/写访问(通过NTFS-3G)支持
  • 支持Intel x86和PowerPC系统,包括Mac
  • 具有建立系统启动盘能力
  • 支持Windows注册编辑和Linux密码修改能力
  • 能通过CD启动FreeDOS, Memtest86+, 硬盘诊断和其他磁盘。
    还有很多…

下载SystemRescureCD,使用CD-ROM或USB运行它:
http://www.sysresccd.org/Download
关于如何在U盘上安装SystemRescureCD,可查看文档:
http://www.sysresccd.org/Sysresccd-manual-en_How_to_install_SystemRescueCd_on_an_USB-stick

—————-
4. Gparted Live

Gparted Live是一个非常小的Linux分发工具,其提供了所有最新的Gparted应用。
此工具可以通过启动CD盘或U盘来进行损坏的分区恢复,建立分区,从丢失的分区中拯救数据并具有一些其他功能。

特性:

GParted使得你能简单管理磁盘分区:

  • 建立分区表(eg. msdos或gpt)
  • 建立,移动,拷贝,调整大小,检查,label,设置新UUID和删除分区
  • 启用和禁用分区标记(eg. boot或hidden)
  • 将分区对齐至兆字节(MB)或传统的柱面分界
  • 尝试从丢失的分区中救援数据

GParted对以下存储设备可用: 

  • 磁盘驱动(eg. SATA, IDE和SCSI)
  • 闪存设备,如U盘和固态硬盘(SSD)
  • RAID设备(硬件RAID,母板BIOS RAID和Linux软RAID)
  • 所有扇区大小(eg. 对使用512, 1024, 2048, 4096字节或更多字节作为扇区的设备)

下载Gparteded Live
http://gparted.org/download.php
关于如何在U盘上安装Gparted,可查看文档:
http://gparted.org/liveusb.php

—————-
3. Avira Rescure System

Avira Rescure System是一套免费工具包括了一个被用于写一个可启动CD的可下载ISO文件。它有一个基于Linux的自有操作系统。
它可用于清理一个无法启动的PC, 且它能找到系统中的恶意软件。工具包括了反病毒程序和当前最新的病毒库。它在启动主机后进入反病毒程序,
然后进行系统扫描并清除恶意软件,同时恢复正常的启动操作。由于其更新频繁,因此总能获得其最新的安全更新。

Avira Rescure System是一个基本的启动反病毒程序,其对病毒进行扫描但同时也会对不可启动或损坏的系统进行修复。

下载Avira Rescure System
http://www.avira.com/en/download/product/avira-rescue-system
关于如何在U盘上安装Avira Rescure System,可查看文档:
https://answers.avira.com/en/question/booting-avira-rescue-system-from-a-usb-stick-8879

—————-
2. Trinity Rescue Kit

Trinity Rescue Kit(TRK)是一个免费开源的Linux分发命令行界面工具。TRK被设计并部署为一个CD或USB。TRK作者Tom Kerremans也将第三方用于修复损坏文件,恢复数据,重置密码,探测计算机病毒和磁盘克隆等小工具包含了进来。TRK被特别设计用于修复Microsoft Windows和Unix-like操作系统一般问题。

为了降低磁盘空间需求,TRK使用了一个定制的help命令,trkhelp,以代替通常Linux发布的man pages.

预览版build 396已经在2014年3月发布。其中一个TRK分支称为Mango(MAssive Network GhOst)已由Juan Carlos Pineda发布,修改专用于简化克隆计算机的操作。

特性:
TRK 3.3是基于Linux 2.6.26

  • 6个控制台(可以使用alt+F1来切换访问)
  • 如果有CD-RW刻录,提供了自我更新能力(反病毒定义/驱动)
  • 数据恢复工具
  • 在网络上克隆Windows
  • 反病毒扫描工具(ClamAV, F-Prot, AVG Anti-Virus, BitDefender, Avast!)
  • 通过ntfs-3g对NTFS分区进行读/写
  • clonentfs使你能拷贝所有驱动中使用过的空间
  • 编辑分区层
  • SSH服务器
  • Samba服务器(以一个用户或一个来客共享本地网络驱动)
  • 逻辑卷管理
  • Proxy服务器支持
  • 支持搭桥(网路通过其他计算机时允许tcpdump)

下载Trinity Rescue Kit (TRK)
http://trinityhome.org/Home/index.php?content=TRINITY_RESCUE_KIT_DOWNLOAD&front_id=12&lang=en&locale=en
关于如何在U盘上安装Trinity Rescue Kit (TRK),可查看文档:
http://trinityhome.org/Home/index.php?content=5.1_HOW_TO_INSTALL_UPGRADE_YOUR_USB_MEDIA_TO_RUN_T&front_id=12&lang=en&locale=en

—————-
1. Knoppix

Knoppix是Linux分发版中作为修复坏损系统最好和最多使用的恢复工具。

Knoppix是一个基于Debian设计的操作系统,可以通过CD/DVD或U盘启动。Knoppix由Linux顾问Klaus Knopper开发。当启动程序,它被加载并解压到RAM中。

尽管Knoppix被主要设计作为CD来使用,它也可以像一个传统操作系统一样安装在一块硬盘上。那些支持从USB设备启动的计算机就可以从USB闪存驱动或内存卡上加载Knoppix。

当前有两种Knoppix版本:传统精简磁盘(700MB)版本和DVD(4.7GB)”Maxi”版本。两个版本都支持两种特定语言:英语和德语。
Knoppix大多包含免费和开源软件,但也包括一些专利软件,只要其符合某些条件情况下,你也可以使用它们。
Knoppix能被很容易地用于从无法访问的操作系统磁盘中copy文件。快速并安全地使用Linux软件,使用CD也可以用于替代其他OS。

Knoppix中包含的内容:
超过1000个以上的软件包被包含在CD版本中,而DVD则含有2600多个软件包。DVD可存储达到9GB压缩形式的文件。这些包包括:

  • LXDE, 一个轻量X11桌面环境(默认6.0.1或更高),或KDE 3, 一个功能更多更完整的桌面(默认5.3.1或更早版本)
  • MPlayer,支持MP3,Ogg音频播放
  • Internet访问软件,包括KPPP拨号和ISDN工具。
  • Iceweasel网页浏览器(基于Mozilla Firefox)
  • Icedove电子邮件客户端(基于Mozilla Thunderbird)
  • GIMP,一个镜像修改程序
  • 数据救援和系统修理工具
  • 网络分析和管理工具
  • LibreOffice,一个综合办公套件
  • 终端服务器

下载Knoppix
http://www.knopper.net/knoppix-mirrors/index-en.html
关于如何在U盘上安装Knoppix,可查看文档:
http://www.knopper.net/knoppix/knoppix-flash-en.html

总结:

在Linux平台上存在非常多的数据恢复工具,但对我来说,这5个是对Linux用户最好且最易使用的。如果遇到数据恢复问题,大家可以下载并使用体验下。

 

SHOUG老汪的APOUC 2015台北会议札记

 

APOUC 2015年度活动于4月28日台北君悦酒店举行,时间为期3天。除第一天是仅对晚上到场的与会者进行自助餐形式的欢迎招待外。之后就会进入紧凑而有序的两天会议议程。

我们SHOUG一行在4月25日已早早地“侵入”台北啦:),不得不吐槽一下台湾签发的入台证,需要提早1个月就开始申请不说,如果去之前申请入台证需要加急,那费用更是贵得吓人(200元1天/人的加价)。
如果大家准备去台湾个人游的话,记得去淘宝找下中青旅关于入台证服务的购买介绍,早准备多省钱哦!!

从上海到台湾的飞机耗时真的不长,2个小时不到就着陆了,来之前就已经规划好了所有需要准备的事项:住宿,路线,悠游卡购买,3G手机上网卡7天期购买,外币兑换等等。
虽然旅行中或多或少还是会碰到了一些状况,比如迷宫一样的台北捷运车站。。。,比如不习惯的大肠面线早饭。。。

 

apouc001_wm_d21f04498ad625054197b0ef06501056378c4207

 

 

不过总体来说还是很顺利的,毕竟语言交流无障碍么:),而且7-Eleven超市到处都有,里面都有提供银联的ATM机,可以很容易的进行台币兑换。

总体台湾给我们的感觉是:干净整洁,有序紧凑。老百姓素质都很高(看他们的垃圾分类和捷运排队就知道了)。
店铺林立,日式店很多,和台湾的店铺一起融为一体,毫无违和感。
电瓶车超多,疯狂的小电瓶让出租车汗颜。自行车好少,且和人一起在上街道走。
到处都有学习补习班和牙医诊所。。

 

 

 

OK,回到旅游方面。
蒋中正纪念馆,中山纪念堂,台北故宫等有历史意义的参观总体上来说乏善可陈(下图为中山纪念堂降旗仪式)。

 

 

台北动物园(猫空缆车),西门町,台北诚品书店等还是应该去看下的。相对上海动物园来说,台北动物园的动物布局合理,景色优美,而且相当干净,水晶猫空缆车可以全角度拍照,很赞。

 

 

 

去西门町可以去尝尝那里正版的豪大大鸡排,超大又实惠的!!而且那里有很多漫画书卖,喜欢漫画,手办,抱枕的朋友可以去看下。
在台北由于那边的咖啡店到处都是,所以相对价格也便宜了些,星巴克相比上海每杯便宜10~15新台币。

去那里一定要去喝下那边天仁茗茶店做的奶茶,那可是台湾同胞点名推荐的哦~~,喝过了你就会知道,奶茶除了有奶之外,也应该有茶~~,好喝不腻又正宗么~~

 

 

————–
终于等到了28日APOUC开会的那天:)
参与此会议活动的代表来自整个亚太区,Oracle为我们免费提供了两晚的住宿和君悦早上及中午的餐饮。

期间和澳大利亚,日本,台湾,泰国等各个国家的代表进行了一些交流,你可以问他们一些你感兴趣的话题,当然他们也会向你询问一些中国的情况。
如最近阿里巴巴淘宝在中国的发展情况,从中国来台湾是否顺利,你们OUG的发展情况等等。如果你英文很差也没关系,我告诉他们我是带着耳朵学英文的,他们哈哈笑着说:”OK, no problem”。
你也可以通过会议厅后的介绍墙了解各国代表的大致背景情况。

 

 

 

会议日程:

 

 

其中主要的议题是关于Oracle在当下对Cloud(IaaS, DaaS, PaaS, SaaS)方面的发展及布局, Java(J2EE 8介绍), MySQL 5.7(Fabric, NDB)新特性的介绍等。

 

 

Oracle除了一些会议介绍时将大家召集在一起进行之外,在进行技术方面的议程时,针对不同兴趣及背景的与会者提供了2个分支会场。
由于我对于Oracle Database 12c及MySQL新特性都很感兴趣,因此不得不辗转2个会议厅。所幸相关议题的在时间上都做了很好的安排,能够让我满载而归。

本次会议亮点:
1. 这次会议中请来了Thomas Kyte来为Oracle Cloud做整体介绍,他的主题为<The Importance of Oracle Cloud>。

 

 

 

其后他还参与了第二天<Internet of Things and the Future of User Communities>的多人讨论话题活动。

 

2. 老印Sunder Ram关于<DB Cloud Finally Here!>的演讲对Oracle Database 12c的多租户特性做了介绍。他给我的印象深刻是因为他的语速超快…而且不太停顿…
1小时的演讲感觉内容太多时间很短,所以唯有加快语速才能完成…好吧,英语不好的我只能将那么多介绍通通听为BaLaBaLaBaLaBaLaBaLa…了:)

3. 整个会议的UG代表中澳大利亚代表参与得尤为积极,每次都会有一些问题并与演讲者积极互动,再此感慨下学好英语的重要性,不然被问到Any Questions的时候,一片沉默,好尴尬,真的不是我不想举手的说 -_-|||
我在本次会议的第三天被安排了4 min pitch的演讲。不过4分钟的时间太短了,坑爹了。一不小心没控制好时间… 就被主持人给叫停了… 好吧, 以后还是整个SHOUG is a happly family这样的简单介绍得了,嘿嘿…

 

 

 

相聚的时候总是很短,感谢APOUC在第二天的超赞晚餐(龙虾,佛跳墙,大闸蟹…),晚上顺便去台北的影院看了场还未在大陆放映的3D版《复仇者联盟2》。

————–

时间总是过得飞快,转眼已经在回上海的飞机上了…来之前,网上看了天气预报说在台湾的几天都会下雨,结果在台湾风和日丽,阳光明媚,偶尔的毛毛雨更添诗意~~。
回到上海机场,外面风凉雨大… 总想着怎么这么快就回来了呢?… 好吧,让我们默默期待下一年APOUC会议的召开:)

 

 

“我们通过参与APOUC 2015充分了解到Oracle在公有云和私有云领域的宏大布局,听到了Oracle官方的云回响。这使得SHOUG能更清晰地向广大中国地区用户传播Oracle云技术及云战略”
— by SHOUG上海Oracle用户组主席刘相兵

 


 

– by Biot, SHOUG

Apple美国苹果公司的Oracle数据库的AWR报告

640

 

这是一份Apple公司的Oracle数据库的AWR报告,硬件上基于Exadata X2。 基于这份报告AskMaclean论坛水友作了多方面的评价。 AWR报告下载地址:http://t.askmac.cn/forum.php?mod=attachment&aid=MzQ3NnxjMTY5NzExOHwxNDI3MDk5MDk0fDB8NDUzNQ%3D%3D

基于2方面来讨论此报告:

  • 国外的DBA的管理风格
  • 国外开发人员的代码风格

网友Oracle顾问说道:没有国内最常见的顺序读和全表扫描的IO问题。

网友游泳虎: 应该是2-2的满配,cell single block就是sequential read吧?cursor_sharing居然是force。应用分区没做好。

网友XKGLOB刀:SQL ordered by Sharable Memory那里的SQL语句让我印象深刻,IN后面很多变量,这样的语句很难共享cursor,并且parse花的内存多时间久. 2.有RAC相关的隐含参数,top5里RAC相关的事件也多 3. IOStat显示写redo89GB,我按load profile算是42GB,却只切换了一次.
网友文宇Baron:主要的问题是insert语句导致PRODUCTTASK_LASTMODDATE_P索引竞争引起gc buffer busy, 核心的解决办法还是是修改索引字段的生成方法,看来苹果的应用也没有对RAC作针对性的优化阿

网友原则丶张记:唯一看出来的是,编码风格:大小写统一、全部使用绑定变量,8节点rac gc这么管理的确实很好。应用设计估计很厉害。

网友 不了峰 1. undo_retention=36000 挺好的

log buffer=130M

2.Estd Interconnect traffic (KB)=30MB,从每秒有1GB的逻辑读来看,感觉也没有太多的cache fusion . 前台的应用应该有针对性的分节点.

3.感觉大部分的表都放在了同一个表空间中. 从而猜想这个表空间应该很大

4. 有做DataGuard

代码方面, 使用绑定变量,并且应该是大部分使用长连接

但有少量的rollback

整体上看,很好的吧~

了解db.collection.find()

db.collection.find()可能是mongodb中最常用的方法之一了,其定义为db.collection.find(query, projection), 即查询一个collection中的文档并返回一个包含了选定文件(document)的字段(field)的游标。

 

参数   query : 是可选参数,基于查询操作符指定了查询的条件,若希望返回collection中的所有文件,则无需指定该query 参数,直接 db.collection.find()即可

参数 projection:是可选参数,指定了那些字段是需要返回的,若要返回所有字段则不必要指定该参数。

 

projection参数的形式如下:

{ field1: <boolean>, field2: <boolean> ... }


如上boolean布尔类型可以是下面的值:

  • 1 或者 true 代表包含该field。find()方法总是包括_id字段,即便你这里没有指定要_id字段。
  • 0或者false 代表不不包含该field。

 

例如:

> db.dbdao_student.insert({name:"maclean",age:30,score:100});
WriteResult({ "nInserted" : 1 })
> db.dbdao_student.insert({name:"jiang",age:20,score:100});
WriteResult({ "nInserted" : 1 })
>
>
>
> db.dbdao_student.find({},{age:1});
{ "_id" : ObjectId("55461b72fefe5936ccc41386"), "age" : 30 }
{ "_id" : ObjectId("55461b7cfefe5936ccc41387"), "age" : 20 }

一个更复杂一些的例子:

 

对于给定的collection, tab1

> db.dbdao_tab1.insert({a:0,b:0,c:0});
WriteResult({ "nInserted" : 1 })
> db.dbdao_tab1.insert({a:0,b:0,c:0});
WriteResult({ "nInserted" : 1 })
> db.dbdao_tab1.insert({a:1,b:1,c:1});
WriteResult({ "nInserted" : 1 })
> db.dbdao_tab1.insert({a:1,b:2,c:1});
WriteResult({ "nInserted" : 1 })
> db.dbdao_tab1.insert({a:2,b:2,c:2});
WriteResult({ "nInserted" : 1 })
> db.dbdao_tab1.insert({a:2,b:2,c:2});
WriteResult({ "nInserted" : 1 })
> db.dbdao_tab1.insert({a:3,b:3,c:3});
WriteResult({ "nInserted" : 1 })
> db.dbdao_tab1.insert({a:3,b:3,c:3});
WriteResult({ "nInserted" : 1 })
> db.dbdao_tab1.insert({a:4,b:4,c:4});
WriteResult({ "nInserted" : 1 })
> db.dbdao_tab1.insert({a:4,b:4,c:4});
WriteResult({ "nInserted" : 1 })

> db.dbdao_tab1.find()
{ "_id" : ObjectId("554727b8ce7f1dc05695adad"), "a" : 0, "b" : 0, "c" : 0 }
{ "_id" : ObjectId("554727bdce7f1dc05695adae"), "a" : 0, "b" : 0, "c" : 0 }
{ "_id" : ObjectId("554727c7ce7f1dc05695adaf"), "a" : 1, "b" : 1, "c" : 1 }
{ "_id" : ObjectId("554727ccce7f1dc05695adb0"), "a" : 1, "b" : 2, "c" : 1 }
{ "_id" : ObjectId("554727d6ce7f1dc05695adb1"), "a" : 2, "b" : 2, "c" : 2 }
{ "_id" : ObjectId("554727dfce7f1dc05695adb2"), "a" : 2, "b" : 2, "c" : 2 }
{ "_id" : ObjectId("554727e7ce7f1dc05695adb3"), "a" : 3, "b" : 3, "c" : 3 }
{ "_id" : ObjectId("554727eece7f1dc05695adb4"), "a" : 3, "b" : 3, "c" : 3 }
{ "_id" : ObjectId("554727f6ce7f1dc05695adb5"), "a" : 4, "b" : 4, "c" : 4 }
{ "_id" : ObjectId("554727fbce7f1dc05695adb6"), "a" : 4, "b" : 4, "c" : 4 }

对于查询db.dbdao_tab1.find( {a:1,b:2} , {a:1} ),会返回多少个document

> db.dbdao_tab1.find( {a:1,b:2} , {a:1} ); 
{ "_id" : ObjectId("554727ccce7f1dc05695adb0"), "a" : 1 }


 

Screen Shot 2015-05-04 at 4.12.18 PM

例子

返回一个collection中的所有document

find()方法不加任何参数即从一个collection中返回所有的document 包括了所有的field。 举例来说,下面的操作返回了dbdao中所有的文档:

db.dbdao.find()

查找符合匹配查询条件的document

如下面的例子查找dbdao_products 中qty > 25的document

db.dbdao_products.find( { qty: { $gt: 25 } } )

 

> db.dbdao_tab1.find( { a : { $gt :1} } );
{ "_id" : ObjectId("554727d6ce7f1dc05695adb1"), "a" : 2, "b" : 2, "c" : 2 }
{ "_id" : ObjectId("554727dfce7f1dc05695adb2"), "a" : 2, "b" : 2, "c" : 2 }
{ "_id" : ObjectId("554727e7ce7f1dc05695adb3"), "a" : 3, "b" : 3, "c" : 3 }
{ "_id" : ObjectId("554727eece7f1dc05695adb4"), "a" : 3, "b" : 3, "c" : 3 }
{ "_id" : ObjectId("554727f6ce7f1dc05695adb5"), "a" : 4, "b" : 4, "c" : 4 }
{ "_id" : ObjectId("554727fbce7f1dc05695adb6"), "a" : 4, "b" : 4, "c" : 4 }
> 

> db.dbdao_tab1.find( { a : { $in : [ 1 ,2 ] } });
{ "_id" : ObjectId("554727c7ce7f1dc05695adaf"), "a" : 1, "b" : 1, "c" : 1 }
{ "_id" : ObjectId("554727ccce7f1dc05695adb0"), "a" : 1, "b" : 2, "c" : 1 }
{ "_id" : ObjectId("554727d6ce7f1dc05695adb1"), "a" : 2, "b" : 2, "c" : 2 }
{ "_id" : ObjectId("554727dfce7f1dc05695adb2"), "a" : 2, "b" : 2, "c" : 2 }

 

使用操作符的查询

下面的查询返回dbdao_tab3集合中_id=5或者或者为ObjectId(“5547301bdda6d7285bef03f7”)的记录

 

> db.dbdao_tab3.find();
{ "_id" : 432424, "a" : 1 }
{ "_id" : ObjectId("5547301bdda6d7285bef03f7"), "a" : 10 }

> db.dbdao_tab3.find(
... { _id : { $in : [432424,ObjectId("5547301bdda6d7285bef03f7") ] }
... }
... )
{ "_id" : 432424, "a" : 1 }
{ "_id" : ObjectId("5547301bdda6d7285bef03f7"), "a" : 10 }




 

范围查询

组合使用比较操作符来实现范围查询,下面的操作会返回field在value1 和 value2之间的document:

db.collection.find( { field: { $gt: value1, $lt: value2 } } );

MongoDB的技术优势

任何关系型数据库RDBMS均会有典型的Schema Design模式设计来规划系统中有多少张表以及这些表之间的关联。但在MongoDB中没有关系relationship 的概念

MongoDB对比RDBMS关系型数据库的优势

 

  • schema less:MongoDB是基于文档存储的数据库,在MongoDB中一个collection集合中可以存放多个不同的文档。 文档与文档之间对比,字段的数量,字段的和大小都是可以不同的。
  • 单个对象的结构清楚
  • MongoDB通过不支持JOIN来深化其横向扩展能力
  • 深度查询能力。MongoDB通过基于文档的查询语言提供针对文档的动态查询语言,其查询能力接近于SQL语言。
  • 易于扩展,MongDB具备很好的扩展性
  • 对于数据库对象和应用对象之间的转换更少
  • 使用内部内存来排序工作集,让数据访问更快速

为什么使用MongoDB?

  • 面向文档的存储方式:数据被以JSON风格文档形式存放
  • 任何属性均可索引
  • 具有复制和高可用特性
  • 自动数据分片
  • 丰富的查询功能
  • 快速的数据库升级
  • 有mongodb(10gen)公司提供支持

 

何处可以使用MongoDB?

  • Big Data
  • 内容管理和发布
  • 移动和社交
  • 用户数据管理
  • Data HUB

MongoDB的一些优势

which of the following describe situations where mongodb has a clear advantage over a typical relational database? check all apply

  1. developer need to get an application into production quickily
  2. Queries from applications are ad hoc and unpredictable
  3. The data model changes frequently
  4. Many Long running complex transactions are present

 

由于mongodb是schema less的所以其初始开发速度异常的快, schema less意味着开发人员可以够少地做模式方案设计,更快将应用投产。

同时由于mongodb是schema less的,所以其数据模型变更几乎不需要做任何操作(alter table add/modify)。

对于ad hoc &unpredictable 特性的、无法预估的查询,mongodb对于字段搜索,范围查询、正则表达查询都支持。查询可以要求返回文件document的部分字段,同时也用上用户自定义的java script函数。

Ad hoc queries
MongoDB supports search by field, range queries, regular expression searches. Queries can return specific fields of documents and also include user-defined JavaScript functions. http://en.wikipedia.org/wiki/MongoDB

Many Long running complex transactions are present  ==》 显然 mongodb中并不适合运行大的长的事务

 

沪ICP备14014813号-2

沪公网安备 31010802001379号