问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

MongoRepository怎么修改数据

发布网友 发布时间:2022-04-07 16:01

我来回答

4个回答

懂视网 时间:2022-04-07 20:22

<summary> /// 官方驱动,返回带分页的结果集 /// </summary> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <returns></returns> PagedResult<TEntity> GetModel(int pageIndex, int pageSize); /// <summary> /// 官方驱动,返回带条件和分页的结果集 /// </summary> /// <param name="expression"></param> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <returns></returns> PagedResult<TEntity> GetModel(Expression<Func<TEntity, bool>> expression, int pageIndex, int pageSize); /// <summary> /// 官方驱动,返回带排序和分页的结果集 /// </summary> /// <param name="fields"></param> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <returns></returns> PagedResult<TEntity> GetModel(Dictionary<Expression<Func<TEntity, object>>, bool> fields, int pageIndex, int pageSize); /// <summary> /// 官方驱动,返回带条件和排序及分页的结果集 /// </summary> /// <param name="expression"></param> /// <param name="fields"></param> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <returns></returns> PagedResult<TEntity> GetModel(Expression<Func<TEntity, bool>> expression, Dictionary<Expression<Func<TEntity, object>>, bool> fields, int pageIndex, int pageSize);

对这四大方法的实现,为了不让MongoDB的更多细节公开,所以,更多的内核只能在仓储中实现了,呵呵

 public PagedResult<TEntity> GetModel(int pageIndex, int pageSize)
 {
  return GetModel(i => true, pageIndex, pageSize);
 }

 public PagedResult<TEntity> GetModel(System.Linq.Expressions.Expression<Func<TEntity, bool>> expression, int pageIndex, int pageSize)
 {
  return GetModel(expression, new Dictionary<Expression<Func<TEntity, object>>, bool>(), pageIndex, pageSize);
 }

 public PagedResult<TEntity> GetModel(
  Dictionary<Expression<Func<TEntity, object>>, bool> fields,
  int pageIndex,
  int pageSize)
 {
  return GetModel(i => true, fields, pageIndex, pageSize);
 }

 public PagedResult<TEntity> GetModel(
  Expression<Func<TEntity, bool>> expression,
  Dictionary<Expression<Func<TEntity, object>>, bool> fields,
  int pageIndex,
  int pageSize)
 {

  SortDefinition<TEntity> sorts = new ObjectSortDefinition<TEntity>(new { });
  foreach (var item in fields)
  {
  if (item.Value)
   sorts = sorts.Ascending(item.Key);
  else
   sorts = sorts.Descending(item.Key);
  }
  var skip = (pageIndex - 1) * pageSize;
  var limit = pageSize;
  var recordCount = _table.CountAsync<TEntity>(i => true).Result;
  return new PagedResult<TEntity>(
  recordCount,
  (int)(recordCount + pageSize - 1) / pageSize,
  pageSize,
  pageIndex,
  _table.Find(expression)
   .Sort(sorts)
   .Skip(skip)
   .Limit(limit)
   .ToListAsync().Result);
 }

OK,现在你可以在业务层去调用它了,基本上面四个方法可以满足你的一切需求了,呵呵!

看下在UI层对它的调用,本DEMO没有BLL层,呵呵

     //
 // GET: /Background/
 public ActionResult Index(int sort = 0, int page = 1)
 {
  Dictionary<Expression<Func<WebManageUsers, object>>, bool> sortList = new System.Collections.Generic.Dictionary<Expression<Func<WebManageUsers, object>>, bool>();
  sortList.Add(i => i.LoginName, sort == 0);
  var model = _webManageUsersRepository.GetModel(sortList,page, 10);
  return View(model);
 }

技术分享

怎么样,看了上面代码是否心里痒痒了,哈哈,赶快去开发你自己的MongoDB仓储吧!

MongoDB学习笔记~为IMongoRepository接口添加了排序和表达式树,针对官方驱动

标签:

热心网友 时间:2022-04-07 17:30

与HibernateRepository类似,通过继承MongoRepository接口,我们可以非常方便地实现对一个对象的增删改查,要使
用Repository的功能,先继承MongoRepository<T,
TD>接口,其中T为仓库保存的bean类,TD为该bean的唯一标识的类型,一般为ObjectId。之后在service中注入该接口就可以
使用,无需实现里面的方法,spring会根据定义的规则自动生成。

例:

public interface PersonRepository extends

MongoRepository<Person, ObjectId>{
//这里可以添加额外的查询方法


但是MongoRepository实现了的只是最基本的增删改查的功能,要想增加额外的查询方法,可以按照以下规则定义接口的方法。自定义查询方
法,格式为“findBy+字段名+方法后缀”,方法传进的参数即字段的值,此外还支持分页查询,通过传进一个Pageable对象,返回Page集合。

例:

public interface PersonRepository extends

MongoRepository<Person, ObjectId>{
//查询大于age的数据
public Page<Proct> findByAgeGreaterThan(int age,Pageable page) ;


下面是支持的查询类型,每三条数据分别对应:(方法后缀,方法例子,mongodb原生查询语句)

GreaterThan(大于)
findByAgeGreaterThan(int age)
{"age" : {"$gt" : age}}

LessThan(小于)
findByAgeLessThan(int age)
{"age" : {"$lt" : age}}

Between(在...之间)
findByAgeBetween(int from, int to)
{"age" : {"$gt" : from, "$lt" : to}}

IsNotNull, NotNull(是否非空)
findByFirstnameNotNull()
{"age" : {"$ne" : null}}

IsNull, Null(是否为空)
findByFirstnameNull()
{"age" : null}

Like(模糊查询)
findByFirstnameLike(String name)
{"age" : age} ( age as regex)

(No keyword) findByFirstname(String name)
{"age" : name}

Not(不包含)
findByFirstnameNot(String name)
{"age" : {"$ne" : name}}

Near(查询地理位置相近的)
findByLocationNear(Point point)
{"location" : {"$near" : [x,y]}}

Within(在地理位置范围内的)
findByLocationWithin(Circle circle)
{"location" : {"$within" : {"$center" : [ [x, y], distance]}}}

Within(在地理位置范围内的)
findByLocationWithin(Box box)
{"location" : {"$within" : {"$box" : [ [x1, y1], x2, y2]}}}

尽管以上查询功能已经很丰富,但如果还不能满足使用情况的话可以用一下方法---基于mongodb原本查询语句的查询方式。
例:在原接口中加入

@Query("{ 'name':{'$regex':?2,'$options':'i'}, sales': {'$gte':?1,'$lte':?2}}")
public Page<Proct> findByNameAndAgeRange(String name,double ageFrom,double ageTo,Pageable page);

注释Query里面的就是mongodb原来的查询语法,我们可以定义传进来的查询参数,通过坐标定义方法的参数。

还可以在后面指定要返回的数据字段,如上面的例子修改如下,则只通过person表里面的name和age字段构建person对象。

@Query(value="{ 'name':{'$regex':?2,'$options':'i'}, sales':{'$gte':?1,'$lte':?2}}",fields="{ 'name' : 1, 'age' : 1}")
public Page<Proct> findByNameAndAgeRange(String name,double ageFrom,double ageTo,Pageable page);

热心网友 时间:2022-04-07 18:48

没有用spring提供的MongoRepository接口,他好像没有提供较复杂的更新数据方法,我使用了org.springframework.data.mongodb.core.MongoOperations这个类,它提供了更新方法

eg:
/**
* 把name的mail订阅状态更新为flag
*/
public void updateMailFlag(String name, String flag) throws Exception{
opterations.updateFirst(new Query(new Criteria("name").is(name)),
new Update().set("flag", flag), EmailInfo.class);
}

热心网友 时间:2022-04-07 20:23

可以使用
MongoRepository中的
save()来进行更新操作,不过注意哦,实体类中需要声明iD哦,不然是不会对原有记录进行覆盖的
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 网友师傅你好,有一台吉德自动洗衣机显示E4,是什么故障麻烦帮助提示一下,谢了 喜欢运动的男生更喜欢萝莉还是御姐? 作文 含泪的微笑(只求事例即可) 全自动洗衣机不脱水显示e4是什么意思 男生是喜欢呆萌软妹子多一点呢?还是知性女王御姐? 二次元男生喜欢的女生类型是什么? 含泪的微笑作文600字 吉德洗衣机不接水直接试机出现E4是怎么回事?谢谢 母爱的作文!800字以上。急用 吉德洗衣机上水报警显示E4,跟电机有关系吗 男生喜欢御姐型的还是萝莉型的?为什么喜欢?喜欢她们什么? 含泪的微笑作文650字 男人更喜欢温柔乖巧女人的还是热情狂野有御姐范儿的女人? 作文含泪微笑作文800字百度 以“含泪的微笑”为题写一篇600字作文 含泪的微笑作文800字 怎么把衣服图片拍摄得最清晰? 一伸手衣服就自动飞到身上穿好的视频怎么拍摄 计量,校准,检测和检定是如何区分的 电流互感器 有三个绕组时计量和测量用时有什么区别? 求高中作文 含泪的微笑 请在今晚之前给我 多谢 含泪的微笑作文要怎么写 你们男生喜欢什么类型的女生? 写 母爱 作文的开头和结尾。 男生喜欢易推倒的萌萝莉还是傲娇系御姐? 男生更喜欢御姐还是萝莉,男女之间的喜欢。为什么?详细回答,尤其是天蝎座男生。 为什么有些知名成功人士喜欢写一些心灵鸡汤励志段子 是不是男生都喜欢那种活泼可爱型的女生啊?还是说喜欢那种话少,安静的女生呢?还是喜欢御姐型的勒? 给我几个微信朋友圈经长正能量励志搞笑发视频的 女汉子性格开朗,男人都喜欢这样的女人吗? 御姐的温柔和软妹的温柔有何不同? 男人喜欢御姐高冷型还是可爱型 微信转帐转怎么会转到财富通里面 微信提现到银行卡为什么会到财付通 扫微信零钱付款变成从银行卡里面款财付通转出? 微信钱包提现显示转入财付通,银行卡没收到钱,财付通也没有,是怎么回事 离职后住房公积金怎么全部取出来离职后住房公积金怎么全部取出来 买了个杯子 底下标注着 PC 58 请问能不能耐高温 我买了一个PC材料的杯子,请问这种材料的水杯最多能承受多少度得高温?我怕温度太高的话会有毒 qq如何设置拒收离线文件(请看清问题再回答)