草庐IT

mongodb 初体验

程序员丁某人 2023-03-28 原文

1、docker 安装

  docker run -d -p 27017:27017 --name mongo mongo:latest

2、自定义数据库并创建用户

  进入操作界面

docker exec -it mongo mongo xiufengd

  查看现有角色

show roles;

  创建相应角色用户

db.createUser({user:'admin',pwd:'admin',roles:[{role:"dbAdmin",db:"xiufengd"}]});

  也可以用其他库例如admin的角色来创建用户

db.createUser({user:'admin',pwd:'admin',roles:[{role:"userAdminAnyDatabase",db:"admin"}]});

3、springboot集成测试

  3.1 引包

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
            <version>2.7.1</version>
        </dependency>

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.4</version>
        </dependency>

  3.2 yml文件

spring:
  data:
    mongodb:
    #uri: mongodb://xiufengd:xiufengd@152.136.15.119:27017/test
    host: 152.136.15.119
    port: 27017
    database: test
    authentication-database: xiufengd
    username: xiufengd
    password: xiufengd

  3.3 新建实体类

package com.example.mongodbtest.dao;

import cn.hutool.core.date.DateTime;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import java.util.Date;

/**
 * @author xiufengd
 * @date 2022/7/5 17:07
 * 未来可期
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
// 用Document 表明库中存储的集合名 若缺失则集合名=类名
@Document("test_bean")
public class TestBean {
    /**
     * 文章id
     */
    @Id
    private Long id;

    /**
     * 用户ID
     */
    private Long userId;

    /**
     * 文章标题
     */
    private String title;

    /**
     * 文章内容
     */
    private String content;

    /**
     * 创建时间
     */
    private Date createTime;

    /**
     * 更新时间
     */
    private Date updateTime;

    /**
     * 点赞数量
     */
    private Long thumbUp;

    /**
     * 访客数量
     */
    private Long visits;

    public TestBean(long id, long userId, String title, String content, DateTime createTime, DateTime updateTime, long thumbUp, long visits) {
        this.id=id;
        this.userId = userId;
        this.title=title;
        this.content=content;
        this.createTime = createTime;
        this.updateTime = updateTime;
        this.thumbUp = thumbUp;
        this.visits = visits;
    }
}

  3.4 持久层 

package com.example.mongodbtest.service;


import com.example.mongodbtest.dao.TestBean;
import org.springframework.data.mongodb.repository.MongoRepository;

/**
 * @author xiufengd
 * @date 2022/7/5 17:50
 * 未来可期
 */
public interface ArticleRepository extends MongoRepository<TestBean, Long> {
}

  3.5 测试类

package com.example.mongodbtest;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.json.JSONUtil;
import com.example.mongodbtest.dao.TestBean;
import com.example.mongodbtest.service.ArticleRepository;
import lombok.extern.slf4j.Slf4j;
import org.assertj.core.util.Lists;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.*;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.test.context.junit4.SpringRunner;

import java.text.ParseException;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author xiufengd
 * @date 2022/7/5 18:09
 * 未来可期
 */
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class ArticleRepositoryTest {
    @Autowired
    private ArticleRepository articleRepo;

    @Autowired
    private MongoTemplate mongoTemplate;

    private static Snowflake snowflake = IdUtil.createSnowflake(2, 1);


    /**
     * 测试新增
     */
    @Test
    public void testSave() {
        TestBean article = new TestBean(1L,2L, RandomUtil.randomString(20), RandomUtil.randomString(150), DateUtil.date(), DateUtil.date(), 0L, 0L);
        articleRepo.save(article);
        // 根据ID属性进行新增或更新
        mongoTemplate.save(article);
        log.info("【article】= {}", JSONUtil.toJsonStr(article));
    }

    /**
     * 测试批量新增列表
     */
    @Test
    public void testSaveList() {
        List<TestBean> articles = Lists.newArrayList();
        for (int i = 0; i < 10; i++) {
            articles.add(new TestBean(i+1,snowflake.nextId(), RandomUtil.randomString(20), RandomUtil.randomString(150), DateUtil.date(), DateUtil.date(), 0L, 0L));
        }
        articleRepo.saveAll(articles);

        log.info("【articles】= {}", JSONUtil.toJsonStr(articles.stream().map(TestBean->TestBean.getId()).collect(Collectors.toList())));
    }

    /**
     * 测试更新
     */
    @Test
    public void testUpdate() {
        articleRepo.findById(1L).ifPresent(article -> {
            article.setTitle(article.getTitle() + "更新之后的标题");
            article.setUpdateTime(DateUtil.date());
            articleRepo.save(article);
            log.info("【article】= {}", JSONUtil.toJsonStr(article));
        });
    }

    /**
     * 测试删除
     */
    @Test
    public void testDelete() {
        // 根据主键删除
        articleRepo.deleteById(1L);

        // 全部删除
        articleRepo.deleteAll();
    }

    /**
     * 测试分页排序查询
     */
    @Test
    public void testQuery() throws ParseException {
        Pageable pageable = Pageable.ofSize(2).withPage(0);
        Sort sort = Sort.by("thumbUp", "updateTime").descending().and(Sort.by("title").ascending());
        PageRequest pageRequest = PageRequest.of(0, 5, sort);
        Page<TestBean> page = articleRepo.findAll(pageable);
        List<String> collect = page.getContent().stream().map(e -> JSONUtil.toJsonStr(e)).collect(Collectors.toList());
        collect.forEach(e-> System.out.println("------------------"+e));
    }

    @Test
    public void update(){
        articleRepo.findById(1L).ifPresent(e->{
            e.setTitle("test11111");
            articleRepo.save(e);
        });
    }

 4、遇到问题

  4.1 字段内容过长,超过16M,此时要用文件形式单独存储,用gridFsTemplate

public boolean updateMongo(MongoBean mongoBean) {
        Boolean isSuccess = Boolean.FALSE;
        Query query = Query.query(Criteria.where("id").is(mongoBean.getId()).and("code").is(mongoBean.getCode()));
        Update update = Update.update("utime", mongoBean.getUtime());
        if (StringUtils.isNotBlank(mongoBean.getJson())) {
            gridFsTemplate.delete(Query.query(Criteria.where("filename").is(mongoBean.getId() + "_" + mongoBean.getCode())));
            ObjectId objectId = gridFsTemplate.store(new ByteArrayInputStream(mongoBean.getJson().getBytes(StandardCharsets.UTF_8)), mongoBean.getId() + "_" + mongoBean.getCode()); //自定义文件名
            update.set("json", objectId.toString());
        }
        UpdateResult updateResult = mongoTemplate.updateMulti(query, update, MongoBean.class);
        if (updateResult.getModifiedCount() > 0) {
            isSuccess = Boolean.TRUE;
        }
        return isSuccess;
    }

   4.2 查询文件存储的信息

public String queryMongoWithResult(String id, String code) {
        if (id == null || code == null) {
            return null;
        }
        try {
            Criteria criteria = Criteria.where("filename").is(id + "_" + code); //自定义的文件名
            Query query = Query.query(criteria);
            GridFSFile gridfsFile = gridFsTemplate.findOne(query);
            GridFsResource resource = gridFsTemplate.getResource(gridfsFile);
            String result = new BufferedReader(new InputStreamReader(resource.getInputStream())).lines().collect(Collectors.joining());
            return result;
        } catch (Exception e) {
            log.info("获取数异常"+e);
        }

        return null;
    }

 

 

  

  

有关mongodb 初体验的更多相关文章

  1. 西安华为OD面试体验 - 2

    西安华为OD面试体验开始投简历技术面试进展工作进展开始投简历去年一整年一直在考研和工作之间纠结,感觉自己的状态好像当时的疫情一样差劲。之前刚毕业的时候投了个大厂的简历,结果一面写算法的时候太拉跨了,虽然知道时dfs但是代码熟练度不够,放在平时给足时间自己可以调试通过,但是熟练度不够那面试当时就写不出来被刷了。说真的算法学到后期我感觉最重要的是熟练度和背板子(对于我这种普通玩家来说),面试题如果一上来短时间内想不出思路就完蛋了。然后由于当时找的工作不是很理想就又想考研了。但是考研是有风险的,我自我感觉自己可能冲不上那个学校,而找工作一个没成可以继续找嘛。本着抱着试试看的态度在boss上投了简历,

  2. 「想体验ChatGPT中文聊天?」那快进来,你用不上算我输 - 2

    ♥️作者:白日参商🤵‍♂️个人主页:白日参商主页♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!!🎈🎈加油!加油!加油!加油🎈欢迎评论💬点赞👍🏻收藏📂加关注+!「想体验ChatGPT中文聊天?」那快进来,你用不上算我输项目场景:项目条件一、那就开始吧1、安装ChatGPT-Desktop2、OpenAPI设置二、使用实例恭喜你!!!配置成功了!!!API和URL都是博主免费提供给大家的!!!恭喜你!!!配置成功了!!!API和URL都是博主免费提供给大家的!!!🎈🎈加油!加油!加油!加油🎈欢迎评论💬点赞👍🏻收藏📂加关注+!项目场景:近几个月可以说ChatGPT是火得一

  3. 基于RTS超低延时直播优化强互动场景体验 - 2

    RTS在阿里云视频直播的基础上进行底层技术优化,通过集成阿里云播放器SDK,支持在千万级并发场景下节点间毫秒级延时直播的能力,弥补了传统直播存在3~6秒延时的问题,确保了超低延时、低卡顿、秒开流畅的直播观看体验。本文介绍了基于RTS超低延迟直播优化强互动场景体验的最佳实践方案,并以阿里云播放器Aliplayer为例,详细介绍RTS超低延迟拉流接入、自动降级、排障信息获取等逻辑的实现,助力企业打造互动直播行业的产品竞争力。适用场景该方案适用于对超低延迟直播有诉求的客户,尤其是业务中存在强互动场景直播的场景。强互动场景直播主要是指对主播和观众存在互动,或观众存在更高实时性观看、画面互动需求的情况,

  4. ruby-on-rails - 在一个 Rails 应用程序中使用 PostgreSQL 的 MongoDB - 2

    我可以在一个Rails应用程序中同时使用MongoDB和PostgreSQL吗?具体来说,我最终会想要使用像MongoHQ这样的东西。到目前为止,我未能在实验中进行这项工作。令我担心的是,MongoDB文档特别指出我必须禁用ActiveRecord。任何建议将不胜感激。 最佳答案 您无需禁用ActiveRecord即可使用MongoDB。查看Mongoid只需将gem加上任何模型与您现有的任何ActiveRecord模型一起添加。您应该注意到MongoHQ只是MongoDB的托管服务,可以与任何对象文档映射器(ODM)一起使用。更多

  5. ruby - 使用 mongodb/mongoid 运行时更改模型 - 2

    我必须在mongoid模型中添加几个字段,我知道MongoDB没有迁移,但如果我继续而不删除数据库,使rails完全“重新生成”数据库,它不会显示或使用新的领域!去这里最好的方法是什么?有比删除/重新打开mongodb更软的东西吗?提前致谢卢卡 最佳答案 一般来说,应该可以在运行时用新字段更新旧文档。MongoDB中不需要迁移。您可能想编写rake任务以使用新字段和默认值更新旧文档。您可以通过检查那些默认值为nil的新字段来找到这些文档。更新简单风格:如果您使用默认值定义一个新字段,只要您设置了一个新值,就应该始终使用该值:应用程序

  6. ruby-on-rails - 我如何从 Ruby 代码连接到 mongodb? - 2

    我如何从Ruby代码连接到mongodb? 最佳答案 首先,您必须安装MongoDbgem:geminstallmongo然后运行代码:require'rubygems'#notnecessaryforRuby1.9require'mongo'db=Mongo::Connection.new.db("mydb")#ORdb=Mongo::Connection.new("localhost").db("mydb")#ORdb=Mongo::Connection.new("localhost",27017).db("mydb")

  7. ruby - MongoDB:无法从 BSON 类型 EOO 转换为 Date - 2

    我正在尝试使用聚合框架(使用ruby​​)并像这样投影日期:db['requests'].aggregate([{"$project"=>{_id:0,method:'$method',user:'$user',year:{'$year'=>'$timestamp'}}}])文档是这样的:{_id:ObjectId("5177d7d7df26358289da7dfd"),timestamp:ISODate("2013-04-12T03:58:05+00:00"),method:"POST",status:"200",inputsize:"874",outputsize:"4981",u

  8. ruby - 在 Ruby 中从 MongoDB 中检索字段的子集 - 2

    我试图通过在Ruby中进行的查询从MongoDB获取字段的子集,但它似乎不起作用。它不返回任何结果这是ruby代码:coll.find("title"=>'Halo',:fields=>["title","isrc"])#thisdoesn'twork如果我删除字段散列,它会工作,返回包含所有字段的结果coll.find("title"=>'Halo')#thisworks查看mongodb控制台,第一个查询在mongodb服务器上结束,如下所示:{title:"Halo",fields:["title","isrc"]}如果我尝试从mongo客户端控制台进行查询,它会工作,我会得到结

  9. 评测:对接GPT-4的NewBing使用体验变化 - 2

    GPT-4是OpenAI发布的最新一代语言模型,于2023年3月14日正式发布,并通过API和ChatGPTPlus平台向用户开放。微软也证实,在GPT-4正式发布之前,就已经在部分版本的Bing中使用GPT-4技术。本文旨在对使用GPT-4技术的NewBing进行中立、专业的使用评测,探讨其使用体验的变化。界面与限额早于2月26日小编获得Newbing试用资格,届时Newbing初体验并不理想,限制多,例如对话只能持续5条自动终止,对话字符受限,生成效果不尽如人意。然而今日对接GPT-4全新bing额度扩充至15条,且对话字数扩容至2000字。Newbing提供了三种模式选项,即创造力、平衡

  10. 腾讯云区块链服务平台(TBaaS)长安链体验网络公测试用感受 - 2

    前阵InfoQ社区看到腾讯云腾讯云区块链服务平台(TBaaS)长安链体验活动,一顿操作猛如虎报了个名,体验完用一个字概括:强。非要再加几个字的话,总体感受下来装配模式灵活高效,配套工具完整辩解。话不多说开始主题本文目录结构分为区块链分类和TBaaS平台介绍、TBaaS平台上链教程三个部分一、区块链分类:大体上来说,区块链可分为公链,联盟链,私有链三种:公有链(PublicBlockchain)公有链是指任何人都能参与的区块链。公有链是去中心化程度最高的区块链,不受机构控制,整个账本对所有人公开透明。任何人都能在公有链上查询交易、发送交易、参与记账。加入公有链不需要任何人授权,可以自由加入或者离

随机推荐