mongodb

Posted 木心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb相关的知识,希望对你有一定的参考价值。

录:

1、安装及配置mongodb
2、启动服务时可以指定db的路径和端口
3、基本概念
4、基本指令
5、数据库的CRUD(增删改查)的操作
6、安装图形化工具
7、文档之间的关系
8、sort和投影
9、mongoose
10、通过mongoose连接MongoDB
11、mongoose之Schema和Model
12、mongoose的增加,查询方法
13、mongoose的Document对象

 

1、安装及配置mongodb    <--返回目录

  1)下载安装包:mongodb-win32-x86_64-2008plus-ssl-3.2.4-signed.msi

  2)配置path

  3)cmd 执行 mongod命令

  4)在d盘新建 data/db 目录

  5)cmd 执行mongod命令,启动服务,出现提示:waiting for connections on port 27017; 不要关闭该窗口

  6)新开一个cmd窗口,执行mongo命令,连接服务

 

2、启动服务时可以指定db的路径和端口    <--返回目录

  mongod --dbpath d:\\xxx\\data\\db --port 10086

  

3、基本概念    <--返回目录
  1) 数据库(database)
  2) 集合(collection)
  3) 文档(document)
  在MongoDB中,数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合

 

4、基本指令    <--返回目录
        show dbs
        show databases
            - 显示当前的所有数据库
        use 数据库名
            - 进入到指定的数据库中
        db
            - db表示的是当前所处的数据库
        show collections
            - 显示数据库中所有的集合

 

5、数据库的CRUD(增删改查)的操作    <--返回目录

  向数据库中插入文档 insert, insertOne, inserMany

- 向集合中插入一个文档 db.<collection>.insert(doc)
- 例子:向test数据库中的,stu集合中插入一个新的学生对象{name:"xxx", age:20, gender:"男"}
       db.stu.insert({name:"xxx",age:20, gender:"男"})

- 插入多个文档
- db.stu.insert([{name:"xxx",age:20, gender:"男"}, {...}])

  查询集合中的所有的文档

db.<collection>.find()

   条件查询 find 返回一个数组, findOne 返回一个文档对象

db.<collection>.find({name: \'xxx\'})
db.<collection>.find({age: {$gt: 10}})

  统计count

db.<collection>.find().count()

  修改 update默认只更新一条记录(默认同updateOne), updateOne, updateMany

/* 默认情况下会使用新对象来替换旧对象 */
db.stu.update({gender: \'\'},{gender: \'male\'})
/* 修改指定字段 */
db.stu.update({gender: \'\'},{$set: {gender: \'male\'}})

  删除 remove(默认同deleteMany), deleteOne, deleteMany

/* 删除多个 */
db.stu.remove({gender: \'\'})
/* 删除一个 */
db.stu.remove({gender: \'xx\'}, true)
/* 删除所有,清空集合 */
db.stu.remove({})
/* 删除集合 */
db.stu.drop()

  

6、安装图形化工具    <--返回目录

  安装包:mongodbmanagerfree_inst.exe 或 studio-3t-x64.msi

 

7、文档之间的关系    <--返回目录

  一对一(one to one): 在MongoDB,可以通过内嵌文档的形式来体现出一对一的关系

db.wifeAndHusband.insert([
    {
        name:"黄蓉",
        husband:{
            name:"郭靖"
        }
    }, {...}
]);

  一对多(one to many)或多对一(many to one)

db.users.insert([{_id:1, username:"zs1"},{_id:2, username:"zs2"}]);

db.order.insert({ 
    list:["牛肉","漫画"],
    user_id: 1
});

db.users.find()
db.order.find()

  多对多(many to many)

db.teachers.insert([
    {name:"洪七公"},
    {name:"黄药师"},
    {name:"龟仙人"}
]);

db.stus.insert([
    {
        name:"郭靖",
        tech_ids:[
            ObjectId("59c4806d241d8d36a1d50de4"),
            ObjectId("59c4806d241d8d36a1d50de5")
        ]
    },{
        name:"孙悟空",
        tech_ids:[
            ObjectId("59c4806d241d8d36a1d50de4"),
            ObjectId("59c4806d241d8d36a1d50de5"),
            ObjectId("59c4806d241d8d36a1d50de6")
        ]
    }
])

db.teachers.find()

db.stus.find()

 

 8、sort和投影    <--返回目录

//查询文档时,默认情况是按照_id的值进行排列(升序)
//sort()可以用来指定文档的排序的规则,sort()需要传递一个对象来指定排序规则 1表示升序 -1表示降序
//limit skip sort 可以以任意的顺序进行调用
db.emp.find({}).sort({sal:1,empno:-1});

//在查询时,可以在第二个参数的位置来设置查询结果的 投影,指定查询的字段
db.emp.find({},{ename:1 , _id:0 , sal:1}); // 1查询,0不查询

 

9、mongoose    <--返回目录

  mongoose中为我们提供了几个新的对象
        – Schema(模式对象): Schema对象定义约束了数据库中的文档结构
        – Model: Model对象作为集合中的所有文档的表示,相当于MongoDB数据库中的集合collection
        – Document: Document表示集合中的具体文档,相当于集合中 的一个具体的文档

 

10、通过mongoose连接MongoDB    <--返回目录

  使用Mongoose必须先安装mongoose包: npm install mongoose
  加载Mongoose: const mongoose = require("mongoose")
  连接数据库: mongoose.connect("mongodb://127.0.0.1/test", { useMongoClient: true })
  断开连接: mongoose.disconnect()

const mongoose = require("mongoose")
// WARNING: The `useMongoClient` option is no longer necessary in mongoose 5.x, please remove it.
// mongoose.connect("mongodb://127.0.0.1/test", { useMongoClient: true })
mongoose.connect("mongodb://127.0.0.1/test")

mongoose.connection.once(\'open\', function() {
    console.log(\'mongodb连接成功。。。\')
})

mongoose.connection.once(\'close\', function() {
    console.log(\'mongodb断开连接。。。\')
})

mongoose.disconnect()

 

11、mongoose之Schema和Model    <--返回目录

const mongoose = require("mongoose")
mongoose.connect("mongodb://127.0.0.1/test")

mongoose.connection.once(\'open\', function() {
    console.log(\'mongodb连接成功。。。\')
})

const Schema = mongoose.Schema
// 创建Schema对象
const stuSchema = new Schema({
    name: String,
    age: Number,
    gender: {
        type: String,
        default: \'male\'
    },
    address: String
})

// 通过Schema创建Model
// Model代表的是数据库中的集合,通过Model才能操作数据库
const stuModel = mongoose.model("stu", stuSchema)

// 向数据库中插入一个文档
stuModel.create({
    name: \'张三\',
    age: 10,
    gender: \'male\',
    address: \'中国广东省深圳市\'
}, function(err) {
    if (!err) console.log(\'插入成功...\')
    throw err
})

 

12、mongoose的增加,查询方法    <--返回目录

const mongoose = require("mongoose")
mongoose.connect("mongodb://127.0.0.1/test")

mongoose.connection.once(\'open\', function () {
    console.log(\'mongodb连接成功。。。\')
})

const Schema = mongoose.Schema
// 创建Schema对象
const stuSchema = new Schema({
    name: String,
    age: Number,
    gender: {
        type: String,
        default: \'male\'
    },
    address: String
})

// 通过Schema创建Model
// Model代表的是数据库中的集合,通过Model才能操作数据库
const stuModel = mongoose.model("stu", stuSchema)

// 向数据库中插入一个文档
stuModel.create({
    name: \'张三1\',
    age: 10,
    gender: \'male\',
    address: \'中国广东省深圳市\'
}, function (err, doc) {
    if (!err) {
        console.log(\'插入成功...\')
        console.log(doc)
        console.log(\'主键返回,_id:\', doc._id)
    } else {
        throw err
    }
})

// find查询: 结果集是数组
// stuModel.find({name: \'张三\'}, function(err, docs) {
//     if(!err) {
//         console.log(docs[0].name)
//         console.log(docs)
//     }
// })
// findOne查询:结果集是对象
// stuModel.findOne({name: \'张三\'}, function(err, doc) {
//     if(!err) {
//         console.log(doc.name)
//         console.log(doc)
//     }
// })

// findByIde查询:结果集是对象
// stuModel.findById(\'5e3bd96d1ac8060958762b6a\', function(err, doc) {
//     if(!err) {
//         console.log(doc.name)
//         console.log(doc)
//     }
// })

// 第二参数:投影,即需要查询的字段
// stuModel.find({name: \'张三\'}, {name: 1, age:1, _id: 0}, function(err, docs) {
//     if(!err) {
//         console.log(docs[0].name)
//         console.log(docs)
//     }
// })
stuModel.find({ name: \'张三\' }, \'name age -_id\', function (err, docs) {
    if (!err) {
        console.log(docs[0].name)
        console.log(docs)
    }
})

 

const mongoose = require("mongoose")
mongoose.connect("mongodb://127.0.0.1/test")

mongoose.connection.once(\'open\', function () {
    console.log(\'mongodb连接成功。。。\')
})

const Schema = mongoose.Schema
// 创建Schema对象
const stuSchema = new Schema({
    name: String,
    age: Number,
    gender: {
        type: String,
        default: \'male\'
    },
    address: String
})

// 通过Schema创建Model
// Model代表的是数据库中的集合,通过Model才能操作数据库
const stuModel = mongoose.model("stu", stuSchema)

stuModel.updateOne({ name: \'张三\' }, {$set: {age: 100}}, function (err, result) {
    if (!err) {
        console.log(result) // {ok: 1, nModified: 0, n: 1}
    }
})

stuModel.deleteOne({ name: \'张三\' }, function (err, result) {
    if (!err) {
        console.log(result) // {ok: 1, n: 1, deleteCount: 1}
    }
})

stuModel.count({ name: \'张三1\' }, function (err, result) {
    if (!err) {
        console.log(result)  // 3
    }
})

 

13、mongoose的Document对象    <--返回目录

  Document与集合中的文档对应,Document是Model的实例,通过Model查询到的结果都是Document

 

  save()方法

const mongoose = require("mongoose")
mongoose.connect("mongodb://127.0.0.1/test")

mongoose.connection.once(\'open\', function () {
    console.log(\'mongodb连接成功。。。\')
})

const Schema = mongoose.Schema
// 创建Schema对象
const stuSchema = new Schema({
    name: String,
    age: Number,
    gender: {
        type: String,
        default: \'male\'
    },
    address: String
})

// 通过Schema创建Model
// Model代表的是数据库中的集合,通过Model才能操作数据库
const stuModel = mongoose.model("stu", stuSchema)

const stu = new stuModel({
    name: \'zs\',
    age: 30,
    gender: \'male\',
    address: \'xxx\'
})
/* 打印结果
  stu:  { gender: \'male\',
  _id: 5e3bf0b7e77e9411fcfe3963,
  name: \'zs\',
  age: 30,
  address: \'xxx\' }
*/
console.log(\'stu: \', stu)
stu.save(function (err, result) {
    if (!err) {
        console.log(\'保存成功...\')
        console.log(\'result: \', result)
    }
})
/*
  result:  { gender: \'male\',
  _id: 5e3bf0b7e77e9411fcfe3963,
  name: \'zs\',
  age: 30,
  address: \'xxx\',
  __v: 0 }
*/

  update()方法和remove()方法

const mongoose = require("mongoose")
mongoose.connect("mongodb://127.0.0.1/test")

mongoose.connection.once(\'open\', function () {
    console.log(\'mongodb连接成功。。。\')
})

const Schema = mongoose.Schema
// 创建Schema对象
const stuSchema = new Schema({
    name: String,
    age: Number,
    gender: {
        type: String,
        default: \'male\'
    },
    address: String
})

// 通过Schema创建Model
// Model代表的是数据库中的集合,通过Model才能操作数据库
const stuModel = mongoose.model("stu", stuSchema)

const stu = new stuModel({
    name: \'zs\',
    age: 30,
    gender: \'male\',
    address: \'xxx\'
})

stuModel.findById(\'5e3bf0b7e77e9411fcfe3963\', function(err, doc) {
    if (!err) {
        console.log(\'查询成功, doc: \', doc)
        console.log(\'doc instanceof stuModel: \', doc instanceof stuModel) // true

        doc.update({name: \'zs111\'}, function(err, result) {
            if (!err) {
                console.log(\'更新成功, result: \', result)
            }
        })
    }
})

stuModel.findById(\'5e3bf0b7e77e9411fcfe3963\', function(err, doc) {
    if (!err) {
        console.log(\'查询成功, doc: \', doc)
        console.log(\'doc instanceof stuModel: \', doc instanceof stuModel) // true

        doc.remove(function(err, result) {
            if (!err) {
                console.log(\'删除成功, result: \', result)
            }
        })
    }
})

 

   另一种修改方式:

stuModel.findById(\'5e3be238816b4f69242071da\', function(err, doc) {
    if (!err) {
        console.log(\'查询成功, doc: \', doc)
        console.log(\'doc instanceof stuModel: \', doc instanceof stuModel) // true

        // doc.update({name: \'zs111\'}, function(err, result) {
        //     if (!err) {
        //         console.log(\'更新成功, result: \', result)
        //     }
        // })

        doc.name = \'test\'
        doc.save()
    }
})

---

以上是关于mongodb的主要内容,如果未能解决你的问题,请参考以下文章

ios - Heroku 和 MongoDb 上的自定义解析服务器错误 3080:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项

mongodb关联查询

无法在 MongoDB(猫鼬)文档中追加数组

在 Spring MongoDB 的 ReplaceRoot 管道阶段使用 $mergeObjects

如何创建一个查询来查找 2 个数字之间的值,这些数字是 MongoDB 中的字符串类型

MongoDB GridFS