命令CURD

命令概览

新增

注意写关注

db.collection.insertOne(
   <document>,
   {
      writeConcern: <document>
   }
)

--- 例子
   db.products.insertOne(
       { "item": "envelopes", "qty": 100, type: "Self-Sealing" },
       { writeConcern: { w : "majority", wtimeout : 100 } }
   );
查询
  • in查询
db.inventory.find( { status: { $in: [ "A", "D" ] } } )
SELECT * FROM inventory WHERE status in ("A", "D")

尽管可以使用$or运算符表示此查询,但是 在同一字段上执行相等性检查时,请使用$in运算符而不是$or运算符。

  • And和比较运算
db.inventory.find( { status: "A", qty: { $lt: 30 } } )
SELECT * FROM inventory WHERE status = "A" AND qty < 30

有关不同BSON类型值的比较,请参见指定的BSON比较顺序

名称 描述
$eq 匹配等于指定值的值。
$gt 匹配大于指定值的值。
$gte 匹配大于或等于指定值的值。
$in 匹配数组中指定的任何值。
$lt 匹配小于指定值的值。
$lte 匹配小于或等于指定值的值。
$ne 匹配所有不等于指定值的值。
$nin 不匹配数组中指定的任何值。
  • or条件
db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )
SELECT * FROM inventory WHERE status = "A" OR qty < 30
  • 数组查找
    严格要求数组顺序和元素,有且仅有"red" 和"blank"
db.inventory.find( { tags: ["red", "blank"] } )

忽略顺序和其他元素

db.inventory.find( { tags: { $all: ["red", "blank"] } } )

包含一个元素

db.inventory.find( { tags: "red" } )

多条件匹配
相当于or

db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )

相当于and,使用$elemMatch运算符在数组的元素上指定多个条件

db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )

查询一个元素的数组索引位置
下示例查询dim_cm数组中第二个元素大于25的所有文档:

db.inventory.find( { "dim_cm.1": { $gt: 25 } } )

查询由数组的长度数组,例如,以下选择数组tags具有3个元素的文档 。

db.inventory.find( { "tags": { $size: 3 } } )

查询嵌套在数组中的文档。需要完全匹配

-- 案例数据
db.inventory.insertMany( [
   { item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] },
   { item: "notebook", instock: [ { warehouse: "C", qty: 5 } ] },
   { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 15 } ] },
   { item: "planner", instock: [ { warehouse: "A", qty: 40 }, { warehouse: "B", qty: 5 } ] },
   { item: "postcard", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);

db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )

使用数组索引来查询一个字段中嵌入文档

db.inventory.find( { 'instock.0.qty': { $lte: 20 } } )

单个嵌套文档在嵌套字段上满足多个查询条件

--下面的示例查询文档,其中instock数组具有至少一个嵌入式文档,该文档同时包含 qty等于5的字段和warehouse等于的字段A:
b.inventory.find( { "instock": { $elemMatch: { qty: 5, warehouse: "A" } } } )

-- 下面的示例查询文档,其中instock数组具有至少一个嵌入式文档,该嵌入式文档包含qty大于10和小于或等于的字段20:
db.inventory.find( { "instock": { $elemMatch: { qty: { $gt: 10, $lte: 20 } } } } )
  • 返回特定字段内嵌文件
    The following example returns:
    1、The _id field (returned by default),
    2、The item field,
    3、The status field,
    4、The uom field in the size document.
    The uom field remains embedded in the size document.
-- 案例数据
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 } ] }
]);

内嵌文件中抑制特定的字段

-- 排除size中uom返回
db.inventory.find(
   { status: "A" },
   { "size.uom": 0 }
)

数组中字段返回

-- 返回instock数组中的qty字段
db.inventory.find( { status: "A" }, { item: 1, status: 1, "instock.qty": 1 } )

回数组中的项目特定数组元素
以下示例使用$slice投影运算符返回instock数组中的最后一个元素:

db.inventory.find( { status: "A" }, { item: 1, status: 1, instock: { $slice: -1 } } )
  • null查询
db.inventory.insertMany([
   { _id: 1, item: null },
   { _id: 2 }
])

-- 以上两个语句都匹配
> db.inventory.find( { item: null } )
{ "_id" : 1, "item" : null }
{ "_id" : 2 }

-- The query returns only the document where the item field has a value of null.
> db.inventory.find( { item : { $type: 10 } } )
{ "_id" : 1, "item" : null }

-- 检查字段是否存在
> db.inventory.find( { item : { $exists: false } } )
{ "_id" : 2 }

修改
  • 更新单个文档
    更新第一个item='paper'的文档
  • 使用$set操作员更新的值 size.uom字段"cm"和值status 字段"P"
  • 使用$currentDate运算符将lastModified字段的值更新为当前日期。如果 lastModified字段不存在, $currentDate将创建该字段。有关$currentDate详细信息,请参见 。
client[:inventory].update_one({ item: 'paper'},
                              { '$set' => { 'size.uom' => 'cm', 'status' => 'P' },
                                '$currentDate' => { 'lastModified' => true } })
  • 更新多个文档
    更新qty小于50的所有文档
client[:inventory].update_many({ qty: { '$lt' => 50 } },
                              { '$set' => { 'size.uom' => 'in', 'status' => 'P' },
                                '$currentDate' => { 'lastModified' => true } })
  • 替换文档
    要替换除_id 字段以外的文档的所有内容,请将一个全新的文档作为第二个参数传递给 replace_one()
    替换文档可以具有与原始文档不同的字段。在替换文档中,_id由于该_id字段是不可变的,因此可以省略该字段;但是,如果您包含该_id字段,则该 字段必须与当前值具有相同的值。
client[:inventory].replace_one({ item: 'paper' },
                               { item: 'paper',
                                 instock: [ { warehouse: 'A', qty: 60 },
                                            { warehouse: 'B', qty: 40 } ] })
删除
  • 批量写入和重试
    分为有序和无序批量写入,使用第二个参数{ ordered : false } 控制,默认有序
try {
   db.characters.bulkWrite(
      [
         { insertOne :
            {
               "document" :
               {
                  "_id" : 4, "char" : "Dithras", "class" : "barbarian", "lvl" : 4
               }
            }
         },
         { insertOne :
            {
               "document" :
               {
                  "_id" : 5, "char" : "Taeln", "class" : "fighter", "lvl" : 3
               }
            }
         },
         { updateOne :
            {
               "filter" : { "char" : "Eldon" },
               "update" : { $set : { "status" : "Critical Injury" } }
            }
         },
         { deleteOne :
            { "filter" : { "char" : "Brisbane"} }
         },
         { replaceOne :
            {
               "filter" : { "char" : "Meldane" },
               "replacement" : { "char" : "Tanys", "class" : "oracle", "lvl" : 4 }
            }
         }
      ]
   );
}
catch (e) {
   print(e);
}

SQL到MongoDB的映射图

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351