Toc
  1. MongoDB用法
    1. 2. java代码查询mongo的数据
    2. 3. mongo的分页与排序
Toc
0 results found
Goblin
MongoDB用法
2017/04/25 Code 干货 笔记

MongoDB用法

##1. mongoDB存储数据

  1. 创建集合Collection -> 对应传统数据库的表table

    命令: db.createCollection(name, options) 

    eg:
    db.createCollection("mycol", {capped: true, autoIndexId: true, size: 6142800, max: 10000 })

    1. name是集合的名字
    2. options为集合的可选参数
    ● capped 布尔(如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。
    ●autoIndexId 布尔 如为 true,自动在_id字段创建索引。默认为false。
    ●size 数值 为固定集合指定一个最大值,以千字节计(KB)。如果 capped 为 true,也需要指定该字段。
    ●max 数值 指定固定集合中包含文档的最大数量。
  2. 插入文档

    命令: db.COLLECTION_NAME.insert(document)

    eg:
    db.col.insert({
    "_id": ObjectId("5dfb71b9f6f3fb2a9e1bfb46"),
    "ASPD_ID": "10288094",
    "ASPD_Nm": "缘定三生炽热红25g(电子渠道)",
    ...
    "Br_Sell_Prc": "598",
    "Can_Bybk_Ind": "0",
    "Co_Nm": "紫金矿业集团黄金珠宝有限公司",
    "Wght_UnCd": "0702"
    })

    插入文档你也可以使用 db.COLLECTION_NAME.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。即通过传入的文档来替换已有文档.

    以及:

    • db.COLLECTION_NAME.insertOne():向指定集合中插入一条文档数据
    • db.COLLECTION_NAME.insertMany():向指定集合中插入多条文档数据
  1. 更新文档

    db.COLLECTION_NAME.update(
    <query>,
    <update>,
    {
    upsert: ,
    multi: ,
    writeConcern:
    }
    )

    eg:
    db.COLLECTION_NAME.update(
    {'ASPD_Nm':'缘定三生炽热红25g(电子渠道)'},
    {$set:{'ASPD_Nm':'缘定三生炽热红25g(线下渠道)'})

    - 以上命令就可以实现:
    把ASPD_Nm为缘定三生炽热红25g(电子渠道)的数据中的ASPD_Nm字段的内容, 修改为ASPD_Nm':'缘定三生炽热红25g(线下渠道)

    1. 参数说明
    query : update的查询条件,类似sql update查询内where后面的。
    update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
    upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
    multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
    writeConcern :可选,抛出异常的级别。
  1. 删除文档

    db.COLLECTION_NAME.remove(
    <query>,
    {
    justOne: ,
    writeConcern:
    }
    )

    eg:
    db.COLLECTION_NAME.remove({'ASPD_Nm':'缘定三生炽热红25g(电子渠道)'})

    参数说明:
    query:(可选)删除的文档的条件。
    justOne:(可选)如果设为 true或1,则只删除一个文档如果不设置该参数或使用默认值 false则删除所有匹配条件的文档。
    writeConcern:(可选)抛出异常的级别。

    如果想删除所有数据可以使用:

    db.col.remove({})

    类似于数据库的truncate

  1. 查询文档

    db.COLLECTION_NAME.find(query, projection)

    eg:
    db.apsd_data.find({"ASPD_Nm":"缘定三生炽热红25g(电子渠道)", "Co_Nm":"紫金矿业集团黄金珠宝有限公司"}).pretty()

    参数说明:
    query: 可选,使用查询操作符指定查询条件
    projection: 可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
    ● 可以在查询后追加.pretty()方法使得结果更易读

查询常见的有and与or两种关系.

and查询可以直接在查询语句中 “ , “分隔,

而or则需要使用$or:

db.COLLECTION_NAME.find({
"likes": {$gt:50},
$or: [{"ASPD_Nm":"缘定三生炽热红25g(电子渠道)", "Co_Nm":"紫金矿"}]
}).pretty()

2. java代码查询mongo的数据

postgresql中, 基金/ 保险/ 金条/ 贵金属表都有一个code对应mongo里的一条或多条数据

  1. 引依赖

    <dependencies>

    <dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-data-mongodbartifactId>
    dependency>
    dependencies>
  1. 以基金的详情查询为例:
//创建查询对象
Query query = new Query();
Criteria criteria = new Criteria();
//根据主键在postgresql中查询出当前查询的基金对象
ProductFund fund = fundMapper.selectByPrimaryKey(productId);
//使用query构建查询条件
query = new Query(Criteria.where("code").is(fund.getCode()));
dataSet = "fund_detail_data";
query.addCriteria(criteria);
//用mongoTemplate的查询方法, 入参:查询条件对象query, 返回类型以及要查询的集合
Map data = mongoTemplate.findOne(query, Map.class, dataSet);
//拿到的data是map类型的结构, 列名对应内容. 与存入mongo里的bson类型一致.
  1. 结果data的结构(也是mongodb里存储的数据结构)如下所示:
{
"_id": ObjectId("5dfb71baf6f3fb2a9e1bfb69"),
"ASPD_ID": "10279468",
"ASPD_Nm": "百变小金猪(电子渠道)",
"Acpt_Dntn_Inst_Nm": "",
"AlSal_Ind": "1",
"Ast_RcmdInf_Intd_Cmnt": "《百变小金猪》运用了猪元素与可爱表情相结合进行设计...",
"AtchURL_Adr": "",
"Br_Prmt_MtdCd": ""
...
}
  1. 如果在查询时排除一些字段, 可以:

    //eg: 返回结果过滤_id, Ins_PD_Trl_Cd字段
    query.fields().exclude("_id");
    query.fields().exclude("Ins_PD_Trl_Cd");
  1. 增加一些查询的筛选条件, 可以:

    //eg: 只查PM_PD_ID等于贵金属的code的数据
    criteria.and("PM_PD_ID").is(metal.getCode());

3. mongo的分页与排序

  1. 分页:

    分页可以使用默认的skip,limit关键字结合的方式来实现, 适用于中小数据量.

    //第一页
    db.COLLECTION_NAME.find().limit (10)
    //第二页
    db.COLLECTION_NAME.find().skip(10).limit(10)
    //第三页
    db.COLLECTION_NAME.find().skip(20).limit(10)

    但是在查询时会扫描全表. 然后再返回结果.

解决的方法是: 可以先查出当前页第一条, 然后顺序数pageSize条

  1. 排序:

    db.students.find({ _id:{ $gt: startValue}}).sort({_id: 1})});
    1是升序, -1是降序
打赏
支付宝
微信
本文作者:Goblin
版权声明:本文首发于Goblin的博客,转载请注明出处!