mongodb数据库基本语法

本文介绍了Mongoose数据库操作的基本方法,包括Schema的扩展方法、更新、新增和Sub-Docs等核心概念及其应用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

启动数据库:

重新打开控制台,并且切换数据

1、Schema的扩展:

1.1实例方法:

var PersonSchema = new Schema({name:String,type:String});
//查询类似数据
PersonSchema.methods.findSimilarTypes = function(cb){
    return this.model('Person').find({type:this.type},cb);
}

使用如下:

var PersonModel = mongoose.model('Person',PersonSchema);
var krouky = new PersonSchema({name:'krouky',type:'前端工程师'});
krouky.findSimilarTypes(function(err,persons){
    //persons中就能查询到其他前端工程师
});

1.2 静态方法

 


PersonSchema.statics.findByName = function(name,cb){
    this.find({name:new RegExp(name,'i'),cb});
 }
  var PersonModel = mongoose.model('Person',PersonSchema);
  PersonModel.findByName('krouky',function(err,persons){
    //找到所有名字叫krouky的人
  });

2.更新:

方法1:

 


 PersonModel.findById(id,function(err,person){
      person.name = 'MDragon';
      person.save(function(err){});
 });

方法2:

 


PersonModel.findById(id,function(err,person){
      person.name = 'MDragon';
      var _id = person._id; //需要取出主键_id
      delete person._id;    //再将其删除
      PersonModel.update({_id:_id},person,function(err){});
      //此时才能用Model操作,否则报错
});

 

当然这样的更新很麻烦,可以使用$set属性来配置,这样也不用先查询,如果更新的数据比较少,可用性还是很好的:


    PersonModel.update({_id:_id},{$set:{name:'MDragon'}},function(err){});

 

需要注意,DocumentCRUD操作都是异步执行,callback第一个参数必须是err,而第二个参数各个方法不一样,updatecallback第二个参数是更新的数量,如果要返回更新后的对象,则要使用如下方法


    Person.findByIdAndUpdate(_id,{$set:{name:'MDragon'}},function(err,person){
      console.log(person.name); //MDragon
    });

3.新增

 

如果是Entity,使用save方法,如果是Model,使用create方法


    //使用Entity来增加一条数据
    var krouky = new PersonModel({name:'krouky'});
    krouky.save(callback);
    //使用Model来增加一条数据
    var MDragon = {name:'MDragon'};
    PersonModel.create(MDragon,callback);

两种新增方法区别在于,如果使用Model新增时,传入的对象只能是纯净的JSON对象,不能是由Model创建的实体,原因是:由Model创建的实体krouky虽然打印是只有{name:'krouky'},但是krouky属于Entity,包含有Schema属性和Model数据库行为模型。如果是使用Model创建的对象,传入时一定会将隐藏属性也存入数据库,虽然3.x追加了默认严格属性,但也不必要增加操作的报错

4.Sub Docs

如同SQL数据库中2张表有主外关系,Mongoose将2个Document的嵌套叫做Sub-Docs(子文档)

简单的说就是一个Document嵌套另外一个Document或者Documents:


    var ChildSchema1 = new Schema({name:String});
    var ChildSchema2 = new Schema({name:String});
    var ParentSchema = new Schema({
      children1:ChildSchema1,   //嵌套Document
      children2:[ChildSchema2]  //嵌套Documents
    });

Sub-Docs享受和Documents一样的操作,但是Sub-Docs的操作都由父类去执行


    var ParentModel = db.model('Parent',parentSchema);
    var parent = new ParentModel({
      children2:[{name:'c1'},{name:'c2'}]
    });
    parent.children2[0].name = 'd';
    parent.save(callback);

parent在执行保存时,由于包含children2,他是一个数据库模型对象,因此会先保存chilren2[0]chilren2[1]

如果子文档在更新时出现错误,将直接报在父类文档中,可以这样处理:


    ChildrenSchema.pre('save',function(next){
      if('x' === this.name) return next(new Error('#err:not-x'));
      next();
    });
    var parent = new ParentModel({children1:{name:'not-x'}});
    parent.save(function(err){
      console.log(err.message); //#err:not-x
    });

4.1 查询子文档

如果childrenparent的子文档,可以通过如下方法查询到children


    var child = parent.children.id(id);

4.2 新增、删除、更新

子文档是父文档的一个属性,因此按照属性的操作即可,不同的是在新增父类的时候,子文档是会被先加入进去的。

如果ChildrenSchema是临时的一个子文档,不作为数据库映射集合,可以这样:


    var ParentSchema = new Schema({
      children:{
        name:String
      }
    });
    //其实就是匿名混合模式

 

MongoDB是一种流行的分布式文档数据库,它使用键值对存储数据,并支持JSON格式的数据模型。以下是基本MongoDB操作语法: 1. **连接到数据库**: 使用`mongo shell`命令行工具或客户端驱动程序如`mongodb-driver`,可以连接到名为`db_name`的数据库: ```javascript var MongoClient = require('mongodb').MongoClient; MongoClient.connect("mongodb://localhost:27017/db_name", function(err, client) { if (err) throw err; console.log("Connected successfully to server"); }); ``` 2. **选择集合(Collections)**: 集合类似于关系数据库中的表,通过`.collection()`方法选择: ```javascript var collection = client.db().collection("collection_name"); ``` 3. **插入文档(Documents)**: 插入一条新的文档到集合: ```javascript var doc = { "name": "John", "age": 30 }; collection.insertOne(doc, function(err, result) { if (err) return console.error(err); console.log("Inserted document:", result.ops[0]); }); ``` 4. **查询文档**: 使用`find()`方法获取文档,可以配合`filter()`、`sort()`等操作: ```javascript collection.find({ age: { $gt: 25 } }).toArray(function(err, docs) { if (err) return console.error(err); console.log("Fetched documents:", docs); }); ``` 5. **更新文档**: 使用`updateOne()`或`updateMany()`修改文档: ```javascript collection.updateOne({ name: "John" }, { $set: { age: 31 } }, function(err, result) { if (err) return console.error(err); console.log("Updated document:", result.result.nModified); }); ``` 6. **删除文档**: 删除匹配条件的文档: ```javascript collection.deleteOne({ name: "John" }, function(err, result) { if (err) return console.error(err); console.log("Deleted document:", result.deletedCount); }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值