数据结构:

{"_id" : "000000001",  //Mongodb默认主键

"UID" : "000000001",  //SVC UID

"CREATE_DATE" : "2016-10-21 00:00:00",  //创建时间

"OP_DATE" : "2016-10-21 00:00:00",  //修改时间

"BASE_TAG_LIST" :  //基础标签列表

[

{ "TAG_ID" : "A01", "TAG_CODE" : "1", "TAG_VALUE" : "1" },  //详细标签,此处为内嵌文档

{ "TAG_ID" : "A02", "TAG_CODE" : "0", "TAG_VALUE" : "0" },

{ "TAG_ID" : "A03", "TAG_CODE" : "000000", "TAG_VALUE" : "000000" }

]}

内嵌文档创建符合索引:

MongoCollection<Document> collection = db.getCollection(table);
Document docIndex = new Document();
for (int index = 0;index<list.size();index++){
String indexPara = (String)list.get(index);
String[] indexParaList = indexPara.split("\\+");
System.out.println(indexParaList[0]);//key
System.out.println(indexParaList[1]);//+-1
//组合复合索引
docIndex.append(indexParaList[0],Integer.parseInt(indexParaList[1]));
}
collection.createIndex(docIndex); 普通查询:

命令:db.tag.find({ "UID": "000000001" )

java:
BasicDBObject doc = new BasicDBObject();
doc.put("UID",uid);
MongoCollection<Document> collection = db.getCollection(table);
FindIterable<Document> iterable = collection.find(doc);
/**
* 1. 获取迭代器FindIterable<Document> 2. 获取游标MongoCursor<Document>
* 3.通过游标遍历检索出的文档集合
* */ List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()) {
Document user = cursor.next();
}

内嵌文档查询:
命令:

db.tag.find({"BASE_TAG_LIST.": { $all: [{$elemMatch: {TAG_ID: "A01", TAG_VALUE: "0"}}, {$elemMatch: {TAG_ID: "A02", TAG_VALUE: "1"}}] }})

java:

List dBObjectElelist = new ArrayList<BasicDBObject>();
for (Map.Entry<String, String> entry : map.entrySet()) {
BasicDBObject doc1 = new BasicDBObject();
doc1.put("TAG_ID",entry.getKey());
doc1.put("TAG_VALUE",entry.getValue());
BasicDBObject EleDoc = new BasicDBObject("BASE_TAG_LIST",new BasicDBObject("$elemMatch", doc1));
dBObjectElelist.add(EleDoc);
} BasicDBObject queryObject = new BasicDBObject()
.append(QueryOperators.AND,dBObjectElelist );
FindIterable<Document> cursor = db.getCollection("bdp_user_tag").find(queryObject); List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (Document d: cursor) {
String jsonString = d.toJson();
Map<String, Object> jsonStrToMap = JsonStrToMap
.jsonStrToMap(jsonString);
list.add(jsonStrToMap);
}
return list; 内嵌文档的删除和添加修改:
需求:

修改用户的标签。比如,用户的标签是A01, 标签值是0。

实现场景1:修改标签值

实现场景2:删除标签A01

实现场景3:添加标签A05

修改:

//查找到uid,基础标签tagvalue所在的文档 oldDoc ,得到docUpdate文档
Document oldDoc= new Document("UID",uid);
Document docUpdate= baseIterable.first();//Document d = collection.find(oldDoc).first();
//由文档得到内嵌文档的key,得到内嵌文档的value数组:这时可以对内嵌文档进行数组型的修改
ArrayList<Document> arr=(ArrayList<Document>)(docUpdate.get("BASE_TAG_LIST"));
Integer oldtagIndex = null;
for (int index =0;index < arr.size();index++){
Document docEle = arr.get(index);
if(docEle.get("TAG_ID").equals(tagid) && docEle.get("TAG_VALUE").equals(oldTagvalue)){
oldtagIndex = index;
}
}
if(null != oldtagIndex){
Document arrEleUpdate = arr.get(oldtagIndex);
arrEleUpdate.remove("TAG_VALUE");
arrEleUpdate.put("TAG_VALUE",newTagvalue);
Document newDoc = new Document("BASE_TAG_LIST",arr);
//更新操作,本质是取出内嵌文档的数组,进行修改后更新
collection.updateOne(oldDoc, new Document("$set",newDoc));
}
内嵌文档的添加和删除:
是对上文中arr数组内元素的删除和添加:
删除:arr.remove(int变量);
添加:arr.add(new Document().append(key,value));
 

mongodb内嵌文档的javaapi,增删改查的更多相关文章

  1. MongoDB 内嵌文档

    MongoDB是文档型的数据库系统,doc是MongoDB的数据单位,每个doc相当于关系型数据库的数据行(row),doc和row的区别在于field的原子性:row中的column是不和分割的原子 ...

  2. mongodb内嵌文档的查询

    本文转自:http://blog.163.com/wm_at163/blog/static/1321734902012526103825481/ 1 > db.blog.findOne() { ...

  3. MongoDB内嵌文档操作

    实体定义: [BsonIgnoreExtraElements] public class Person : BaseEntity { public string FirstName { get; se ...

  4. MongoDB学习笔记——文档操作之增删改

    插入文档 使用db.COLLECTION_NAME.insert() 或 db.COLLECTION_NAME.save() 方法向集合中插入文档 db.users.insert( { user_id ...

  5. 多测师讲解接口 _需求文档(用户增删改查)_高级讲师肖sir

    首先连接Duoceshi_new网络 密码为Duoceshi_new,因为接口项目部署在Duoceshi_new网段中. 测试工具:postman域名:http://192.168.1.2:8081/ ...

  6. mongodb对数组元素及内嵌文档进行增删改查操作(转)

    from:https://my.oschina.net/132722/blog/168274 比如我有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下: &l ...

  7. MongoDB对数组元素及内嵌文档进行增删改查操作

    比如我有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下: {    "_id" : "195861",    &qu ...

  8. mongodb查询内嵌文档

    mongodb查询内嵌文档   假设有这样一个文档: db.XXX.remove(); db.XXX.insert({"id":1, "members":[{& ...

  9. MongoDB查询或修改内嵌文档

    作为非关系型数据库中的佼佼者,MongoDB一大优势在于能够在一条文档中存储对象类型的数据,适当增加冗余来让数据库更好用.文档中一个对象类型的字段在MongoDB中被称为内嵌文档(Embedded) ...

随机推荐

  1. 日常杂记——C#验证码

    随机生成验证码,不能以图片的形式存在,所以需要将验证码图片以MemoryStream形式存储在内存的流当中,但是在使用时发现使用PictureBox控件无法显示内存流,所以需要先将流转化为图片,才可以 ...

  2. visual studio开启多核编译方法《转》

    原文:https://blog.csdn.net/acaiwlj/article/details/50240625 visual studio在编译时可以启动多核并行编译,以减少编译所需时间.话不多说 ...

  3. 2017-11-11 Sa Oct 消参

    2017-11-11 Sa Oct 消参 Prior versions: 2017-11-04 Sa Oct 消参 2017-11-10 Fr Oct 消参 2017-11-04 Sa $ P(-3, ...

  4. 如何实现word上传服务器

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

  5. 求$N^N$的首位数字

    正如"大得多"定理所言,当$n\longrightarrow \infty$时: $$  n^n \gg n! \gg a^n \gg n^b \gg ln^kn $$ $f(n) = n^n$的增长 ...

  6. python之列表及其方法---整理集

    列表类,类名是list 通过list类创建对象,使用中括号 列表特性: 使用中括号括起来 中间用逗号分隔每个元素 元素可以是数字.字符串.布尔值.列表 列表中可以嵌套列表 列表中每个元素的下标从0开始 ...

  7. php的trie_filter扩展安装敏感词查找

    #编译libiconv ./configure make make install #编译libdatrie-0.2.11 ./configure LDFLAGS=-L/usr/local/lib L ...

  8. Unity PRO 2018.3.3f1 for MAC+完美pojie补丁!!!

    Unity Pro 2018 for mac是游戏开发必备的软件之一,Unity mac 版主要用于创建2D和3D跨平台游戏,比如三维视频游戏.实时三维动画.建筑可视化等类型,最新版本的Unity P ...

  9. huawei USG防火墙子接口技术的应用案例

    网络拓扑: 在中小企业的办公网络的设计中,通常为了安全考虑,需要将不同部门之间的互访的流量经过防火墙中转,同时结合vpn stance将业务进行隔离,在本例中,使用两台USG防火墙做HA作为整个办公网 ...

  10. Python小白自问自答

    1. 问:python怎么查看命令的含义和用法? 答:查一些简单命令的含义以及用法,直接help(命令)就行了.例如直接输入help(input),这表示查input的用法. 例子如下: help(p ...