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

mongoDB数组查询如何只返回数组中的一条记录

发布网友 发布时间:2022-04-26 20:17

我来回答

2个回答

懂视网 时间:2022-05-01 16:06

  http://docs.spring.io/spring-data/data-mongodb/docs/current/reference/html/

 

1.项目集成MongoDB

<dependency>
	<groupId>org.springframework.data</groupId>
	<artifactId>spring-data-mongodb</artifactId>
	<version>1.3.2.RELEASE</version>
</dependency>

 

2.编写MongoDB基础操作类

技术分享
import java.lang.reflect.ParameterizedType;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import com.mongodb.WriteResult;

/**
 * mongodb 基础操作类
 * 
 * @author yangkun
 * 
 */
public abstract class MongoBaseDao<T> {

 @Autowired
 @Qualifier("mongoTemplate")
 public MongoTemplate mongoTemplate;
 
 private Class<T> entityClass;
 
 /**
 * 初始化DAO时使用反射拿到泛型超类的类型参数
 */
 @SuppressWarnings("unchecked")
 public MongoBaseDao() {
 this.entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
 }

 /**
 * 通过条件查询,查询分页结果
 * 
 * @param pageNo
 * @param pageSize
 * @param query
 * @return
 */
 public Pagination<T> getPage(int pageNo, int pageSize, Query query) {
 long totalCount = this.mongoTemplate.count(query, this.entityClass);
 Pagination<T> page = new Pagination<T>(pageNo, pageSize, totalCount);
 query.skip(page.getFirstResult());// skip相当于从那条记录开始
 query.limit(pageSize);// 从skip开始,取多少条记录
 List<T> datas = this.find(query);
 page.setDatas(datas);
 return page;
 }

 /**
 * 通过条件查询实体(集合)
 * 
 * @param query
 */
 public List<T> find(Query query) {
 return mongoTemplate.find(query, this.entityClass);
 }

 /**
 * 通过一定的条件查询一个实体
 * 
 * @param query
 * @return
 */
 public T findOne(Query query) {
 return mongoTemplate.findOne(query, this.entityClass);
 }

 /**
 * 查询出所有数据
 * 
 * @return
 */
 public List<T> findAll() {
 return this.mongoTemplate.findAll(this.entityClass);
 }

 /**
 * 查询并且修改记录
 * 
 * @param query
 * @param update
 * @return
 */
 public T findAndModify(Query query, Update update) {
 return this.mongoTemplate.findAndModify(query, update, this.entityClass);
 }

 /**
 * 按条件查询,并且删除记录
 * 
 * @param query
 * @return
 */
 public T findAndRemove(Query query) {
 return this.mongoTemplate.findAndRemove(query, this.entityClass);
 }

 /**
 * 通过条件查询更新数据
 * 
 * @param query
 * @param update
 * @return
 */
 public void updateFirst(Query query, Update update) {
 mongoTemplate.updateFirst(query, update, this.entityClass);
 }

 /**
 * 更新多个
 * @param query
 * @param update
 */
 public int updateMulti(Query query, Update update) {
 WriteResult result = mongoTemplate.updateMulti(query, update, this.entityClass);
 return result.getN();
 }
 
 /**
 * 保存一个对象到mongodb
 * 
 * @param bean
 * @return
 */
 public T save(T bean) {
 mongoTemplate.save(bean);
 return bean;
 }

 /**
 * 通过ID获取记录
 * 
 * @param id
 * @return
 */
 public T findById(String id) {
 return mongoTemplate.findById(id, this.entityClass);
 }

 /**
 * 通过ID获取记录,并且指定了集合名(表的意思)
 * 
 * @param id
 * @param collectionName
 *  集合名
 * @return
 */
 public T findById(String id, String collectionName) {
 return mongoTemplate.findById(id, this.entityClass, collectionName);
 }
 
 /**
 * remove
 * @param id
 */
 public void remove(Query query) {
 mongoTemplate.remove(query, entityClass);
 }
 
 /**
 * 保存全部
 * @param list
 * @return
 */
 public List<T> save(List<T> list) {
 mongoTemplate.insertAll(list);
 return list;
 }
}
View Code

 

3.编写AppCategoryDao

技术分享
import java.util.List;

import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;

import com.cyou.nad.goldlocker.dao.base.MongoBaseDao;
import com.cyou.nad.goldlocker.domain.mongo.AppCategory;

/**
 * AppCategoryMongoDao 
 * 
 * @author yangkun
 * 
 */
@Repository
public class AppCategoryMongoDao extends MongoBaseDao<AppCategory> {

 @Override
 public AppCategory findById(String unique) {
 Query q = new Query(Criteria.where("_id").is(unique));
 System.out.print(super.findOne(q).getCategory());
 return super.findOne(q);
 }
 
 @Override
 public List<AppCategory> findAll() {
 Query q = new Query();
 return super.find(q);
 }
 
 @Override
 public AppCategory save(AppCategory app) {
 mongoTemplate.save(app);
 return app;
 }
 
 public void remove(String unique) {
 // TODO Auto-generated method stub
 Query q = new Query(Criteria.where("_id").is(unique));
 Update update = new Update();
 update.set("flag_off", 1);
 mongoTemplate.upsert(q, update, AppCategory.class);
 }
 
 public void remAndinser(AppCategory app) {
 // TODO Auto-generated method stub
 String _id = app.get_id();
 Query q = new Query(Criteria.where("_id").is(_id));
 
 Update update = new Update();
 update.set("category", app.getCategory());
 update.set("flag_off", app.getFlag_off());
 update.set("ctype", app.getCtype());
 update.set("aliases", app.getAliases());
 update.set("words", app.getWords());
 update.set("related", app.getRelated());
 
 mongoTemplate.updateMulti(q, update, AppCategory.class);
 }
 
}
View Code

 

4.编程中遇到的问题

  1.使用update进行更新,更新的代码为:

String _id = app.get_id();
Query q = new Query(Criteria.where("_id").is(_id));
Update update = new Update();
//这里将要更新的内容通过update对象的set方法设置进去,只需要按照字段即可,无需考虑字段类型。

 update.set("category", app.getCategory());
 update.set("flag_off", app.getFlag_off());
 update.set("ctype", app.getCtype());
 update.set("aliases", app.getAliases());
 update.set("words", app.getWords());
 update.set("related", app.getRelated());

mongoTemplate.updateMulti(q, update, AppCategory.class); 

方法解释:
  updateMulti:代表更新有相同条件的所有数据。
  updateFirst:代表只更新有相同条件的第一条数据。
参数解释:
  第一个参数:类似于SQL语句中的where条件。匹配你想更新的数据
  第二个参数:需要更新的内容。
  第三个参数:要更新的类的Class对象

  2.AppCategory获取id问题

技术分享
import java.util.List;

import org.springframework.data.mongodb.core.mapping.Document;

import com.cyou.nad.goldlocker.constant.MongoCollections;

/**
 * AppCategory
 * 
 * @author yangkun
 * 
 */
@Document(collection=MongoCollections.AppCategory)
public class AppCategory {
 
 private String _id;

 private int ctype;
 
 private String flag_off;
 
 private String category;
 
 private List<String> aliases;
 
 private List<String> words;
 
 private Related related;

 
 public int getCtype() {
 return ctype;
 }

 public void setCtype(int ctype) {
 this.ctype = ctype;
 }

 public String get_id() {
 return _id;
 }

 public void set_id(String _id) {
 this._id = _id;
 }
 
 public String getId() {
 return _id;
 }

 public void setId(String id) {
 this._id = id;
 }

 

 public String getFlag_off() {
 return flag_off;
 }

 public void setFlag_off(String flag_off) {
 this.flag_off = flag_off;
 }

 public String getCategory() {
 return category;
 }

 public void setCategory(String category) {
 this.category = category;
 }

 public List<String> getAliases() {
 return aliases;
 }

 public void setAliases(List<String> aliases) {
 this.aliases = aliases;
 }

 public List<String> getWords() {
 return words;
 }

 public void setWords(List<String> words) {
 this.words = words;
 }

 public Related getRelated() {
 return related;
 }

 public void setRelated(Related related) {
 this.related = related;
 }

 
}
View Code

  问题:这里需要根据Mongo自动生成的_id字段去更新内容,前台是通过JSON传递到Controller的,使用fastJson去解析JSON,但是解析出来的app类的_id总是不会被设置上值。导致无法通过_id被更新。

AppCategory app = JSONObject.parseObject(jsonStr, AppCategory.class);

  于是想到是不是因为AppCategory的_id属性名称的命名问题,导致反射的时候调用不到set方法导致的。于是创建一个新的字段命名为:id,提供get和set方法,在id的set方法中调用_id的set方法。然后问题解决。但是后续因为项目进度原因没有继续研究到底是不是fastJSON的问题,还是别的。不过在之后的pojo的命名方式提供了借鉴。

MongoDB使用记录

标签:

热心网友 时间:2022-05-01 13:14

mongodb中使用aggregate可以返回数组字段数组的指定索引的元素
参考语句:
{$match:{'id':15}},
{$project:{id:1,"default":1}},
{$unwind:"$default.styles"},
{$match:{'default.styles.status':1}},
{$group:{_id:"$_id","defaults":{$push:"$default.styles"}}}
解释:
1:过滤数据{$match:{'id':15}}
2:获取想要的列{$project:{id:1,"default":1}}
3:获取展开后数组字段{$unwind:"$default.styles"}
4:条件查询数组元素{$match:{'default.styles.status':1}}
5:分组后保存结果{$group:{_id:"$_id","defaults":{$push:"$default.styles"}}}
数据结构如下:
{
"_id" : ObjectId("55dad346ea23e7c11beefce5"),
"id" : 11.0,
"default" : {
"style" : "普通会诊",
"alias" : "",
"money" : "0",
"styles" : [{
"code" : 1,
"style" : "普通会诊",
"alias" : "一般会诊",
"money" : 100,
"status" : 1,
"remark" : "需要患者亲自来到医院"
} {
"code" : 6,
"style" : "夜间门诊",
"alias" : "夜间门诊",
"money" : 100,
"status" : 0,
"remark" : "夜间门诊"
}, {
"code" : 7,
"style" : "其他门诊",
"alias" : "其他门诊",
"money" : 10,
"status" : 0,
"remark" : "其他门诊"
}]
}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 黑龙江债权转让合同纠纷该怎样取证 安徽债权转让合同纠纷应该怎么样取证 房产官司律师费多少 为什么有关MongoDB采用B树索引,以及Mysql B+树做索引 Mongodb中的键值对是什么意思 mongodb是数据库还是数据仓库 简述mongodb和主流关系数据库的区别 mongodb 数据类型 怎样使用 mongodb底层使用松散的什么作为数据存储格式 mongodb用什么格式存储数据 中兴手机开不了机? 阿玛尼口红中样三件套都有带皮盒的吗 请鉴定这个阿玛尼小胖丁唇釉小样的真假 高分辨率显示器 字体过小 怎么办 怎么把电脑显示屏的字变小? 怎么调电脑显示屏字体大小? 1920x1080分辨率的液晶显示器觉得字体太小了怎么办 电脑显示器字体太小,怎么设置? 换了显示器字体变小了怎么调 显示屏字体大小如何设置 显示器上的字很小怎么办 比基尼是怎么由来的? 衣服??? ACDC DCDC电源模块 跟变压器 有什么区别啊? 貌似很多时候是可以通用的···· 浩辰cad 2011 标准版激活码 ACDC-4DD0-4C33-4C31-5354-355D产品编号 通用技术高手:2011年浙江省通用技术会考选择题答案 ac 24伏和dc 24伏的时间继电器可以通用吗? psp3000 6.20 tn-c升级到6.20 pro系统,存档通用不? 急急急!!三维设计新课标英语通用版必修2单元仿真测验答案 应急照明集中灯DC24ⅴ和AC24V有什么区别,能通用吗? 额定电压AC85-265V 50&#47;60Hz DC6-12V 和 额定电压 AC85-265V 50&#47;60HzDC12-24V的LED筒灯变压器能通用吗? CBB450vAC30uf和CBB450vDC30uF通用吗? 有三维设计英语通用版单元仿真检测答案吗? 座位险一万每座是什么意思 座位险1万是什么意思 车上人员责任险10000元 推荐几首重低音效果强烈的歌曲 推荐几首低音强烈的歌曲 求推荐低音较强的歌曲 座位险买了一万,车上人员受伤要发一万六左右,座位险能赔多少? 您有哪些想推荐的低音感强的英文歌曲? 车辆座位险中7座*10000%座是什么意思 “司机/乘客座位责任险保额2万元/座”什么意思?