MongoDB Shell简单入门(增删改查)

来源:互联网 发布:我的淘宝 编辑:程序博客网 时间:2024/06/06 01:45

一、MongoDB文档结构

在MongoDB中一条记录对应于一个field-value键值对类型的BSON文档,其结构类似JSON对象。MongoDB文档中的value可以包含各种各样的类型,包括数组、文档、文档数组和内置类型。

{
    “_id” : ObjectId(“54c955492b7c8eb21818bd09”),
    “address” : {
        “street” : “2 Avenue”,
        “zipcode” : “10075”,
        “building” : “1480”,
        “coord” : [ -73.9557413, 40.7720266 ]
    },
    “borough” : “Manhattan”,
    “cuisine” : “Italian”,
    “grades” : [
        {
            “date” : ISODate(“2014-10-01T00:00:00Z”),
            “grade” : “A”,
            “score” : 11
        },
        {
            “date” : ISODate(“2014-01-16T00:00:00Z”),
            “grade” : “B”,
            “score” : 17
        }
    ],
    “name” : “Vella”,
    “restaurant_id” : “41704620”
}

MongoDB将诸多文档(document)存储到集合(collection)中,集合就类似于关系数据库中的表,只不过在关系数据库中同一张表中的所有记录要有相同的关系模式(schema),而在MongoDB中一个集合内的文档不需要有相同的field。

二、MongoDB Shell导入数据

以下操作需要确保机器上的mongod程序(服务)已经运行,并通过MongoDB安装目录下的mongo命令打开mongo shell。

本文使用官方给的样本数据进行说明,通过下面链接可以获取到源数据的json格式文件

https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json

运行以下命令导入数据:

mongoimport –db test –collection restaurants –drop –file ~/downloads/primer-dataset.json

导入完成后选中需要操作的数据库,在这里就是我们刚刚导入数据的test数据库

use test

三、MongoDB Shell查询操作

(一)查询所有文档

db.restaurants.find()

上述操作会返回指定collection内的所有文档的游标(cursor),可以通过保存到一个var变量中遍历游标来查看所有文档。但MongoDB默认会在上述操作之后显示20个文档,然后输入命令 it 可以在显示器上遍历所有文档:

it

还可以通过在上面的查询命令后面添加 pretty(),可以以类似json格式一样的格式化视图查看返回的文档数据。

db.restaurants.find().pretty()

(二)指定等价条件

等价查询命令一般具有以下格式:

{ <field1>: <value1>, <field2>: <value2>, … }

如果<field>是最高级别的field而不是内嵌文档或数组内的field,那么查询中的field的双引号可以省去,其他情况不可省去。

  1. 最高级别

    db.restaurants.find( { borough: “Manhattan” } )

  2. 内嵌文档或数组
    指定查询条件的field若在内嵌文档或数组内,则需要用点号 (.) 分隔:

    db.restaurants.find( { “address.zipcode”: “10075” } ) //内嵌文档
    db.restaurants.find( { “grades.grade”: “B” } ) //数组

(三)指定运算条件

MongoDB提供了许多运算符以便查询,具体请见下面链接:
https://docs.mongodb.com/manual/reference/operator/query-comparison/

除了 $or$and ,其他运算符一般都具有以下形式:

{ <field1>: { <operator1>: <value1> } }

  1. 大于运算( $gt )
    查询grades数组中存在一条以上score大于30的内嵌评价的餐厅:

    db.restaurants.find( { “grades.score”: { $gt: 30 } } )

  2. 小于运算( $lt )
    查询grades数组中存在一条以上score小于10的内嵌评价的餐厅:

    db.restaurants.find( { “grades.score”: { $lt: 10 } } )

(四)组合运算

  1. 逻辑AND
    可以通过逗号( , )分隔多个查询条件构成逻辑AND查询:

    db.restaurants.find( { “cuisine”: “Italian”, “address.zipcode”: “10075” } )

  2. 逻辑OR
    通过使用 $or 运算符可以构成逻辑OR查询:

    db.restaurants.find(
        { $or: [ { “cuisine”: “Italian” }, { “address.zipcode”: “10075” } ] }
    )

(五)排序查询结果

为对查询结果进行排序,可以在查询方法后面添加 sort() 方法。需要向sort()方法传递排序参照的field以及对应的排序类型值,例如:1代表升序,-1代表降序。

db.restaurants.find().sort( { “borough”: 1, “address.zipcode”: 1 } )

上面的命令操作将返回所有文档并先按borough升序排序(字典排序),然后相同borough的文档之中再按address.zipcode升序排序。

四、MongoDB Shell插入操作

insert() 方法传递一个BSON文档即可插入该文档。另外如果我们尝试讲一个文档插入(添加)到一个本不存在的collection中(这在MongoDB是可以的),MongoDB将为我们自动创建该collection。

下面操作将插入一个餐厅文档到test数据库restaurants集合中。注意,如果restaurants不存在,MongoDB将自动为我们创建。

db.restaurants.insert(
    {
        “address” : {
            “street” : “2 Avenue”,
            “zipcode” : “10075”,
            “building” : “1480”,
            “coord” : [ -73.9557413, 40.7720266 ]
        },
        “borough” : “Manhattan”,
        “cuisine” : “Italian”,
        “grades” : [
            {
                “date” : ISODate(“2014-10-01T00:00:00Z”),
                “grade” : “A”,
                “score” : 11
            },
            {
                “date” : ISODate(“2014-01-16T00:00:00Z”),
                “grade” : “B”,
                “score” : 17
            }
        ],
        “name” : “Vella”,
        “restaurant_id” : “41704620”
    }
)

该操作会返回一个包含操作结果的WriteResult对象:

WriteResult({ “nInserted” : 1 })

如果传递给 insert() 方法的文档未包含 _id 字段,那么MongoDB将自动为我们创建并生成ObjectId作为 _id 的值。

五、MongoDB Shell更新操作

update() 操作一般可以分为两种,一种是仅 更新指定field,另一种是 替换整个文档

默认地, update() 一次仅更新一个文档,如果想更新符合查询条件的多个文档,需要在 update() 方法中添加 multi 选项并设置为true。

更新操作也会返回一个包含操作结果的WriteResult对象。

(一)更新指定field

与查询一样,更新操作也可以分为最高等级和内嵌文档或数组两类。

  1. 最高等级
    下面操作将使用 $set 运算符来更新 cuisine 字段的值,并使用 $currentDatelastModified 字段的值更新为当前时间。

    db.restaurants.update(
        { “name” : “Juni” },
        {
            $set: { “cuisine”: “American (New)” },
            $currentDate: { “lastModified”: true }
        }
    )

  2. 内嵌文档或数组
    同查询操作,查询条件中包含内嵌文档或数组的field时,需要使用点号( . )进行分隔:

    db.restaurants.update(
        { “restaurant_id” : “41156888” },
        { $set: { “address.street”: “East 31st Street” } }
    )

  3. 更新多个文档
    update() 方法中使用 multi 选项可以同时更新多个符合条件的文档:

    db.restaurants.update(
        { “address.zipcode”: “10016”, cuisine: “Other” },
        {
            $set: { cuisine: “Category To Be Determined” },
            $currentDate: { “lastModified”: true }
        },
        { multi: true}
    )

(二)替换整个文档

update() 方法还可以用于替换整个文档,但由于 _id 字段是不可修改的,因而只能更新文档的其他部分。

db.restaurants.update(
    { “restaurant_id” : “41704620” },
    {
        “name” : “Vella 2”,
        “address” : {
                “coord” : [ -73.9557413, 40.7720266 ],
                “building” : “1480”,
                “street” : “2 Avenue”,
                “zipcode” : “10075”
        }
    }
)

上面操作将原来文档给替换成了只含 _id 、name、address字段的文档。

六、MongoDB Shell删除操作

remove() 方法可以用于删除文档。注意,remove() 方法默认会删除所有符合条件的文档,若想仅删除一个,则需要使用 justOne 选项。

删除操作也会返回一个包含操作结果的WriteResult对象

(一)删除符合条件的所有文档

db.restaurants.remove( { “borough”: “Manhattan” } )

上述操作将删除所有borough为Manhattan的文档。

(二)仅删除一个符合条件的文档

db.restaurants.remove( { “borough”: “Queens” }, { justOne: true } )

通过将 justOne 选项设置为true,可以仅删除符合条件的一个文档。

(三)删除所有文档

db.restaurants.remove( { } )

(四)删除Collection

该操作会删除所有collection内的文档和索引。

db.restaurants.drop()

drop() 方法执行成功会返回true:

true

否则则返回false。

原创粉丝点击