美文网首页
mongoose中的Document,Model和Query

mongoose中的Document,Model和Query

作者: 夏liao夏天 | 来源:发表于2018-11-18 16:09 被阅读0次

    一.基本概念

    1. MongoDB中的Collection就相当于Mysql 中的table,Collection中的Document就相当于table中的row
    2. mongoose中的Model类似于JavaScript中的类,提供了许多的函数,方便对数据库进行操作,Document就是Model的一个实例,Schema给Model定型,规定Model需要包含哪些东西,而Query是命令,相当于一条sql语句,告诉数据库要做什么。

    二.实例分析

    1.以Model的APIfindById为例

    image.png
    findById返回一个<<Query>>, 也就是说如果你只是调用这个函数的话,如
    const mongoose = require('mongoose');
    const Schema = mongoose.Schema;
    
    mongoose.connect(
      'mongodb://localhost:5000/test',
      {
        useNewUrlParser: true
      }
    );
    mongoose.connection.on('open', () => {
      console.log('Connected to MongoDB');
    });
    mongoose.connection.on('error', () => {
      console.log('Failed to connect to MongoDB');
      process.exit(-1);
    });
    
    const schema = new Schema({
      name: {
        type: String,
        required: true
      }
    });
    
    const User = mongoose.model('user', schema);
    
    async function main() {
      //console.log(await User.create({ name: 'User1' }));
      let query = User.findById('5bf113de76a9230bcebdf8e2');
      console.log(query);
    }
    
    main();
    
    

    这时候console.log(user1)会发现user1只是一个Query而已

    Query {
      _mongooseOptions: {},
      _transforms: [],
      mongooseCollection:
       NativeCollection {
         collection: null,
         opts:
          { bufferCommands: true,
            capped: false,
            '$wasForceClosed': undefined },
         name: 'users',
         collectionName: 'users',
    

    User.findById()是你定义好的一个命令,让数据库根据你传入的Id返回你需要的Document, 但是你还没有执行这个命令,当然它现在就只是一个Query而已。

    执行的办法有三种:

    • 使用回调函数
    // executes immediately, passing results to callback
    User.findById('5bf113de76a9230bcebdf8e2', function (err, doc) {
      console.log(doc);
    });
    

    输出结果

    { _id: 5bf113de76a9230bcebdf8e2, name: 'User1', __v: 0 }
    
    • 调用Query自带的exec(callback)执行
    let query = User.findById('5bf113de76a9230bcebdf8e2');
    query.exec(function(err, doc) {
      console.log(doc);
    });
    
    • 使用await,因为一个Query默认是一个Promise, Query调用exec()后,如果没有传递callback函数,也默认返回一个Promise
      let user1 = await User.findById('5bf113de76a9230bcebdf8e2');
      console.log(user1);
    

      let user1 = await User.findById('5bf113de76a9230bcebdf8e2').exec();
      console.log(user1);
    

    相关文章

      网友评论

          本文标题:mongoose中的Document,Model和Query

          本文链接:https://www.haomeiwen.com/subject/vuawfqtx.html