MongoDb添加,更新,查询文档,运算符使用,日期,聚合,分页操作

学习主题:MongoDb
学习目标:
掌握如下内容
1.添加文档
2.更新文档
3.查询文档
4.运算符的使用
5.日期操作
6.聚合操作
7.分页操作

一、插入文档

package com.bjsxt;

import com.mongodb.client.MongoCollection;
import org.bson.Document;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


/**
 * 插入文档
 */
public class InsertDocument {

    public static void main(String[] args) {
        InsertDocument doc=new InsertDocument();
        /*doc.insertSingleDocument();*/
        doc.insertManyDocument();
    }
    /**
     * 插入单个文档
     */
    public void insertSingleDocument(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        Document docu = new Document();
        docu.append("username","lisi").append("userage",26).append("userdesc","Very Good").append("userlike", Arrays.asList(new String[]{"Music","Sport"}));
        collection.insertOne(docu);
    }

    /**
     * 插入多个文档
     */
    public void insertManyDocument(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        List<Document> list=new ArrayList<Document>();
        for (int i=0;i<5;i++){
            Document docu=new Document();
            docu.append("username","zhangsan"+i);
            docu.append("userage",37+i);
            docu.append("userdesc","Pretty"+i);
            docu.append("userlike", Arrays.asList(new String[]{"Music","Sport"}));
            list.add(docu);
        }
        collection.insertMany(list);
    }
}

二、 更新文档

package com.bjsxt;

import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.Filters;
import org.bson.Document;

import java.util.logging.Filter;

/**
 * 更新文档
 */
public class UpdateDocument {
    public static void main(String[] args) {
        UpdateDocument updoc=new UpdateDocument();
        /*updoc.updateSingleDocumentSingleKey();*/
       /* updoc.updateSingleDocumentManyKey();*/
       /* updoc.updateManyDocumentSingleKey();*/
       /* updoc.updateManyDocumentManyKey();*/
        updoc.updateDocumentArray();
    }
    /**
     * 更新单个文档单个键
     */
    public void updateSingleDocumentSingleKey(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        //更新文档单个键
        //Filters 封装了条件的一个工具类 {$set:{userage:28}}
        collection.updateOne(Filters.eq("username","lisi"),new Document("$set",new Document("userage",29)));
    }

    /**
     * 更新单个文档多个键
     */
    public void updateSingleDocumentManyKey(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        collection.updateOne(Filters.eq("username","zhangsan0"),new Document("$set",new Document("userage",18).append("userdesc","LOVE")));
    }

    /**
     * 更新多个文档单个键
     */
    public void updateManyDocumentSingleKey(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        collection.updateMany(Filters.ne("username",null),new Document("$set",new Document("userdesc","LOVE")));
    }

    /**
     * 更新多个文档多个键
     */
    public void updateManyDocumentManyKey(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        collection.updateMany(Filters.ne("username",null),new Document("$set",new Document("userdesc","LOVE").append("userage",27)));
    }

    /**
     * 更新文档数组
     */
    public void updateDocumentArray(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        collection.updateOne(Filters.eq("username","lisi"),new Document("$push",new Document("userlike","Art")));

    }
}

三、查询文档

package com.bjsxt;

import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.model.Filters;
import org.bson.Document;
import org.bson.types.ObjectId;

import java.util.regex.Pattern;

/**
 * 查询文档
 */
public class SelectDocument {
    public static void main(String[] args) {
        SelectDocument doc=new SelectDocument();
       /* doc.selectDocumentAll();*/
       /* doc.selectDocumentById();*/
      /*  doc.selectDocumentConditionByGt();*/
      /*  doc.selectDocumentConditionByType();*/
       /* doc.selectDocumentConditionByIn();*/
       /* doc.selectDocumentConditionByNin();*/
       /* doc.selectDocumentConditionByRegex();*/
       /* doc.selectDocumentConditionByAnd();*/
        /*doc.selectDocumentConditionByOr();*/
        /*doc.selectDocumentConditionByAndOr();*/
        doc.selectDocumentSorting();
    }

    /**
     * 查询所有文档
     */
    public void selectDocumentAll(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        // 返回的是一个文档的迭代器
        FindIterable<Document> iterable = collection.find();
        MongoCursor<Document> cursor = iterable.iterator();
        while (cursor.hasNext()){
            Document docu = cursor.next();
            System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
        }
    }

    /**
     * 根据id查询文档
     */
    public void selectDocumentById(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        FindIterable<Document> iterable = collection.find(Filters.eq("_id",new ObjectId("5dc0d97770725e0888467aa9")));
        //返回一个文档迭代器
        MongoCursor<Document> cursor = iterable.iterator();
        while (cursor.hasNext()){
            Document docu = cursor.next();
            System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
        }
    }
    /**
     * 根据条件查询文档,年龄大于22
     */
    public void selectDocumentConditionByGt(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        FindIterable<Document> iterable = collection.find(Filters.gt("userage",22));
        //返回一个文档迭代器
        MongoCursor<Document> cursor = iterable.iterator();
        while (cursor.hasNext()){
            Document docu = cursor.next();
            System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
        }
    }

    /**
     * 根据字段类型查询文档
     */
    public void selectDocumentConditionByType(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        FindIterable iterable = collection.find(Filters.type("userage","number"));
        //返回文档迭代器
        MongoCursor<Document> cursor = iterable.iterator();
        while (cursor.hasNext()){
            Document docu = cursor.next();
            System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
        }
    }

    /**
     * 查询筛选,查name为zhangsan0,zhangsan1
     */
    public void selectDocumentConditionByIn(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        FindIterable iterable = collection.find(Filters.in("username","zhangsan0","zhangsan1"));
        //返回文档迭代器
        MongoCursor<Document> cursor = iterable.iterator();
        while (cursor.hasNext()){
            Document docu = cursor.next();
            System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
        }
    }

    /**
     * 查询筛选,查name不为zhangsan0,zhangsan1
     */
    public void selectDocumentConditionByNin(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        FindIterable iterable = collection.find(Filters.nin("username","zhangsan0","zhangsan1"));
        //返回文档迭代器
        MongoCursor<Document> cursor = iterable.iterator();
        while (cursor.hasNext()){
            Document docu = cursor.next();
            System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
        }
    }
    /**
     *正则表达式查询文档,以z开头2结尾
     */
    public void selectDocumentConditionByRegex(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        FindIterable iterable = collection.find(Filters.regex("username", Pattern.compile("^z.*2")));
        //返回文档迭代器
        MongoCursor<Document> cursor = iterable.iterator();
        while (cursor.hasNext()){
            Document docu = cursor.next();
            System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
        }
    }
    /**
     *  查询用户 username 是 zhangsan1 并且年龄为 20 岁的用户
     */
    public void selectDocumentConditionByAnd(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        FindIterable iterable = collection.find(Filters.and(Filters.eq("username","zhangsan1"),Filters.eq("userage",20),Filters.eq("userdesc","HELLO")));
        //返回文档迭代器
        MongoCursor<Document> cursor = iterable.iterator();
        while (cursor.hasNext()){
            Document docu = cursor.next();
            System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
        }
    }

    /**
     * 查询用户要求 username 是 lisi ,或者 userage 是 27  或者  userdesc 是 HELLO
     */
    public void selectDocumentConditionByOr(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        FindIterable iterable = collection.find(Filters.or(Filters.eq("username","lisi"),Filters.eq("userage",27),Filters.eq("userdesc","HELLO")));
        //返回文档迭代器
        MongoCursor<Document> cursor = iterable.iterator();
        while (cursor.hasNext()){
            Document docu = cursor.next();
            System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
        }
    }

    /**
     *  查询文档中 username 为 zhangsan1 并且年龄为 20 岁,或者 userdesc 为 LOVE
     */
    public void selectDocumentConditionByAndOr(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        FindIterable iterable = collection.find(Filters.or(Filters.and(Filters.eq("username","zhangsan1"),Filters.eq("userage",20)),Filters.eq("userdesc","LOVE")));
        //返回文档迭代器
        MongoCursor<Document> cursor = iterable.iterator();
        while (cursor.hasNext()){
            Document docu = cursor.next();
            System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
        }
    }

    /**
     *  查询文档中 username 是 z 开头的,根据 username 对结果做降序排序。 1升序排序,  -1 降序排序规则 $sort:{username,-1}
     */
    public void selectDocumentSorting(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        FindIterable iterable = collection.find(Filters.regex("username",Pattern.compile("^z"))).sort(new Document("username",-1));
        //获取文档迭代器
        MongoCursor<Document> cursor  = iterable.iterator();
        while (cursor.hasNext()){
            Document docu = cursor.next();
            System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
        }
    }
}

四、日期操作

package com.bjsxt;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtil {

    /**
     * Date To String
     */
    public static String dateToString(String pattern, Date date){
        SimpleDateFormat dateFormat=new SimpleDateFormat(pattern);
        return dateFormat.format(date);
    }

    /**
     * String To Date
     */
    public static Date stringToDate(String pattern,String date){
        SimpleDateFormat dateFormat=new SimpleDateFormat(pattern);
        Date d=null;
        try {
            d=dateFormat.parse(date);
        }catch (Exception e){
            e.printStackTrace();
        }
        return d;
    }
}


package com.bjsxt;

import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.model.Filters;
import org.bson.Document;

import java.util.Arrays;
import java.util.Date;


/**
 * 插入时间
 */
public class DateOperation {
    public static void main(String[] args) {
        DateOperation operation=new DateOperation();
        /*operation.inserDocumentSystemDate();*/
       /* operation.insertDocumentCustoDate();*/
       /* operation.selectDocumentDateUseEq();*/
        operation.selectDocumentDateUseGt();
    }

    /**
     * 插入系统当前时间
     */
    public void inserDocumentSystemDate(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        Document docu=new Document();
        docu.put("username","laozh");
        docu.put("userage",18);
        docu.put("userdesc","LOVE");
        docu.put("userlike", Arrays.asList("Look","Eat"));
        docu.put("userbirth",new Date());
        collection.insertOne(docu);
    }

    /**
     * 插入自定义时间
     */
    public void insertDocumentCustoDate(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        Date date = DateUtil.stringToDate("yyyy-MM-dd HH:mm:ss", "2019-12-06 21:30:36");
        Document docu=new Document();
        docu.put("username","hhz");
        docu.put("userage",20);
        docu.put("userdesc","YOU");
        docu.put("userlike", Arrays.asList(new String[]{"Sing","Good"}));
        docu.put("userbirth",date);
        collection.insertOne(docu);
    }

    /**
     * 查询日期 : 2019-12-06 21:30:36
     */
    public void selectDocumentDateUseEq(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        Date date = DateUtil.stringToDate("yyyy-MM-dd HH:mm:ss", "2019-12-06 21:30:36");
        FindIterable iterable = collection.find(Filters.eq("userbirth",date));
        MongoCursor<Document> cursor  = iterable.iterator();
        while (cursor.hasNext()){
            Document docu = cursor.next();
            String temp = DateUtil.dateToString("yyyy-MM-dd HH:mm:ss", (Date) docu.get("userbirth"));
            System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike")+"\t"+temp);
        }
    }

    /**
     * 查询日期大于2019-01-01 00:00:00
     */
    public void selectDocumentDateUseGt(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
        Date date = DateUtil.stringToDate("yyyy-MM-dd HH:mm:ss", "2019-01-01 00:00:00");
        FindIterable iterable = collection.find(Filters.gt("userbirth",date));
        MongoCursor<Document> cursor  = iterable.iterator();
        while (cursor.hasNext()){
            Document docu = cursor.next();
            String temp=DateUtil.dateToString("yyyy-MM-dd HH:mm:ss",(Date)docu.get("userbirth"));
            System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike")+"\t"+temp);
        }
    }
}

五、聚合操作

package com.bjsxt;

import com.mongodb.client.AggregateIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import org.bson.Document;

import java.util.ArrayList;
import java.util.List;


public class AggregateOper {
    public static void main(String[] args) {
        AggregateOper aggregateOper=new AggregateOper();
        /*aggregateOper.selectDocumentAggregateCount();*/
        /*aggregateOper.selectDocumentAggregateSum();*/
        /*aggregateOper.selectDocumentAggregateGroupBySum();*/
        /*aggregateOper.selectDocumentAggregateGroupByWhere();*/
        aggregateOper.selectDocumentAggregateGroupByHaving();
    }

    /**
     *  需求:查询集合中的文档数量
     *  db.dev.aggregate([{$group:{_id:null,count:{$sum:1}}}])
     */
    public void selectDocumentAggregateCount(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "dev");
        Document sum=new Document();
        sum.put("$sum",1);

        Document count=new Document();
        count.put("_id",null);
        count.put("count",sum);

        Document group=new Document();
        group.put("$group",count);

        List<Document> list=new ArrayList<Document>();
        list.add(group);

        AggregateIterable iterable = collection.aggregate(list);
        //返回文档迭代器
        MongoCursor<Document> cursor = iterable.iterator();
        while(cursor.hasNext()){
            Document docu = cursor.next();
            System.out.println(docu.get("count"));
        }
    }

    /**
     *  需求:查询集合中所有 size 键中的值的总和
     *  db.dev.aggregate([{$group:{_id:null,totalSize:{$sum:"$size"}}}])
     */
    public void selectDocumentAggregateSum(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "dev");
        Document sum=new Document();
        sum.put("$sum","$size");

        Document totalSize =new Document();
        totalSize.put("_id",null);
        totalSize.put("totalSize",sum);

        Document group=new Document();
        group.put("$group",totalSize);

        List<Document> list=new ArrayList<Document>();
        list.add(group);
        AggregateIterable iterable = collection.aggregate(list);
        MongoCursor<Document> cursor = iterable.iterator();
        while (cursor.hasNext()){
            Document docu = cursor.next();
            System.out.println(docu.get("totalSize"));
        }
    }

    /**
     *  需求:对 title 进行分组,计算每组中的 size 的总和
     *  db.dev.aggregate([{$group:{_id:"$title",totalSize:{$sum:"$size"}}}])
     */
    public void selectDocumentAggregateGroupBySum(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "dev");
        Document sum=new Document();
        sum.put("$sum","$size");

        Document totalSize=new Document();
        totalSize.put("_id","$title");
        totalSize.put("totalSize",sum);

        Document group=new Document();
        group.put("$group",totalSize);

        List<Document> list=new ArrayList<Document>();
        list.add(group);
        AggregateIterable iterable = collection.aggregate(list);
        MongoCursor<Document> cursor = iterable.iterator();
        while (cursor.hasNext()){
            Document docu = cursor.next();
            System.out.println(docu.get("totalSize"));
        }
    }

    /**
     * 分组前过滤
     *  需求:查询 dev 集合有多少文档的 size 大于 200*  db.dev.aggregate([{$match:{size:{$gt:200}}},{$group:{_id:null,totalSize:{$sum:1}}}])
     */
    public void selectDocumentAggregateGroupByWhere(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "dev");
        Document gt=new Document();
        gt.put("$gt",200);

        Document size=new Document();
        size.put("size",gt);

        Document match=new Document();
        match.put("$match",size);

        Document sum=new Document();
        sum.put("$sum",1);

        Document totalSize=new Document();
        totalSize.put("_id",null);
        totalSize.put("totalSize",sum);

        Document group=new Document();
        group.put("$group",totalSize);
        List<Document> list=new ArrayList<Document>();
        list.add(match);
        list.add(group);
        AggregateIterable iterable = collection.aggregate(list);
        MongoCursor<Document> cursor = iterable.iterator();
        while (cursor.hasNext()){
            Document docu = cursor.next();
            System.out.println(docu.get("totalSize"));
        }
    }

    /**
     *  需求:查询 dev 集合,根据 title 分组计算出每组的 size 的总和,并过滤掉总和小于 200 的文档。
     *  db.dev.aggregate([{$group:{_id:"$title",totalSize:{$sum:"$size"}}},{$match:{totalSize:{$gt:200}}}])
     */
    public void selectDocumentAggregateGroupByHaving(){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "dev");
        Document sum=new Document();
        sum.put("$sum","$size");

        Document totalSize=new Document();
        totalSize.put("_id","$title");
        totalSize.put("totalSize",sum);

        Document group=new Document();
        group.put("$group",totalSize);

        Document gt=new Document();
        gt.put("$gt",200);

        Document mtotalSize=new Document();
        mtotalSize.put("totalSize",gt);

        Document match=new Document();
        match.put("$match",mtotalSize);

        List<Document> list=new ArrayList<Document>();
        list.add(group);
        list.add(match);
        AggregateIterable iterable = collection.aggregate(list);
        MongoCursor<Document> cursor = iterable.iterator();
        while (cursor.hasNext()){
            Document docu = cursor.next();
            System.out.println(docu.get("totalSize"));
        }
    }
}

六、分页查询

package com.bjsxt;

import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import org.bson.Document;
import org.bson.types.ObjectId;


/**
 * 分页查询
 */
public class SelectDocumentByPage {
    public static void main(String[] args) {
        SelectDocumentByPage documentByPage=new SelectDocumentByPage();
        /*documentByPage.selectDocumentByPageUseSkipAndLimit(1);*/
        documentByPage.selectDocumentByPageUseCondition(2,2,"5dbce2df8224cadebb22704c");
    }

    /**
     *  通过 skip 与 limit 方法实现分页
     */
    public void selectDocumentByPageUseSkipAndLimit(Integer pageIndex){
        int page=(pageIndex-1)*2;
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "dev");
        Document condition=new Document("size",new Document("$ne",null));
        long count = collection.countDocuments(condition);
        System.out.println(count);//总条数
        FindIterable iterable = collection.find(condition).skip(page).limit(2);
        MongoCursor<Document> cursor = iterable.iterator();
        while(cursor.hasNext()){
            Document docu = cursor.next();
            System.out.println(docu);
        }
    }

    /**
     * 通过条件判断优化分页查询
     */
    public void selectDocumentByPageUseCondition(int pageIndex,int pagesize,String lastId){
        //获取集合
        MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "dev");
        Document condition=new Document("size",new Document("$ne",null));
        long count = collection.countDocuments(condition);
        System.out.println(count);
        FindIterable iterable=null;
        if (pageIndex==1){
            iterable = collection.find(condition).limit(pagesize);
        }else {
            if (lastId !=null){
                condition.append("_id",new Document("$gt",new ObjectId(lastId)));
                iterable = collection.find(condition).limit(pagesize);
            }
        }
        MongoCursor<Document> cursor = iterable.iterator();
        while (cursor.hasNext()){
            Document docu = cursor.next();
            System.out.println(docu);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值