您好,匿名用户

mongodb如何对数组元素及内嵌文档进行增删改查操作?

0 投票

如题网上搜索到了java版的,但是不懂java,具体地址如下
https://my.oschina.net/132722...
现在要在python,或者js中操作,到底如何在内嵌数组中实现增删改查呢?

问题复制过来是这样的,希望大神指点

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

<!-- lang: js -->
{
    "_id" : "195861",
    "tags" : [
            {
                    "tagId" : NumberLong(766),
                    "optDate" : ISODate("2013-08-12T15:21:02.930Z"),
                    "enable" : true
            },
            {
                    "tagId" : NumberLong(778),
                    "optDate" : ISODate("2013-08-12T15:21:02.930Z"),
                    "enable" : true
            }
    ]

}

下面对这个文档中的tag进行增删该查操作,这里用到了spring mongodb 里面的MongoTemplate类。我这里把tags里的内嵌文档抽象成了Tag类。代码删除和修改本身就包含查询方法,所以没写查询方法

代码如下:

<!-- lang: java -->
/**
 * 
 * @author zhangdonghao
 * 
 */
@Component("UserrTagServiceImpl")
public class UserrTagServiceImpl implements UserrTagService {

/**
 * Mongo DB Spring Template
 */
@Resource
protected MongoTemplate mongoTemplate = null;

public UserrTagServiceImpl() {

}
/**
**给tags数组添加一个元素
*/
@Override
public Response<Integer> addTag(String id, Long tagId) {

    try {
        Tag tag = new Tag(tagId);
        tag.setOptDate(new Date());
        tag.setEnable(true);
        Query query = Query.query(Criteria.where("_id").is(id));
        Update update = new Update();
        update.addToSet("tags", tag);
        mongoTemplate.upsert(query, update, User.class);
    } catch (Exception e) {
        return new Response<Integer>(0);
    }
    return new Response<Integer>(1);
}

/**
**修改tags数组中内嵌文档指定一个元素的值
*/
@Override
public Response<Integer> disableTag(String id, Long tagId) {

    try {
        Query query = Query.query(Criteria.where("_id").is(id)
                .and("tags.tagId").is(tagId));
        Update update = new Update();
        update.set("tags.$.enable", false);
        mongoTemplate.updateFirst(query, update, User.class);
    } catch (Exception e) {
        return new Response<Integer>(0);
    }
    return new Response<Integer>(1);
}
/**
**删除tags数组中指定的内嵌文档
*/
@Override
public Response<Integer> removeTag(String id, Long tagId) {

    try {
        Query query = Query.query(Criteria.where("_id").is(id)
                .and("tags.tagId").is(tagId));
        Update update = new Update();
        update.unset("tags.$");
        mongoTemplate.updateFirst(query, update, User.class);
    } catch (Exception e) {
        return new Response<Integer>(0);
    }

    return new Response<Integer>(1);
}


public MongoTemplate getMongoTemplate() {
    return mongoTemplate;
}

public void setMongoTemplate(MongoTemplate mongoTemplate) {
    this.mongoTemplate = mongoTemplate;
}
}
用户头像 提问 2017年 6月17日 @ Usopp 下士 (944 威望)
分享到:

1个回答

0 投票

不知道题主解决问题没有。如果用mongoose的话,大概是这样的:

1、增加/删除:用数组的$push,$pull操作符号

2、更改的话,用$update 和$位置符

3、查询使用aggregate、match、unwind

大概的code可以参考下面的写法:

var mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/test');

var db = mongoose.connection;

db.on('error',function (err) {
  console.log('Mongoose connection error: ' + err);
});

db.once('open', function() {
  console.log('Mongoose connection connected!');
});

var Schema = mongoose.Schema;

var userSchema = new Schema({
    _id : String,
    tags: [{ _id: false, tagID: Number, optDate: Date, enable: Boolean }]
});

var User = mongoose.model('User', userSchema,'user');

//Query

User.aggregate({ $project: { _id : 1, tags: 1 } }).unwind('tags').exec(function (err, users) {
  if (err) return console.error(err);
  console.log(users);
});

//Insert

User.update({ "_id" : "195861"}, { $push : { tags: {tagID : 888, optDate : Date("2016-08-12T15:21:02.930Z"), enable : false}}},function(err,result){
  if (err) return console.error(err);
  console.log(result);});

//delete

User.update({ "_id" : "195861"}, { $pull : { tags: {tagID : 779}}},function(err,result){
  if (err) return console.error(err);
  console.log(result);});

//Update

User.update(
{ 
     "_id" : "195861",
     "tags.tagID" : 888
},
{
     $set: {
          "tags.$" : {
          'tagID" : 333,
          "optDate" : new Date(),
          "enable" : true}
           }
},function(err,result){
  if (err) return console.error(err);
  console.log(result);});

Love MongoDB! Have Fun!

用户头像 回复 2017年 6月17日 @ Fiddlesticks 下士 (947 威望)
提一个问题:

相关问题

0 投票
1 回复 307 阅读
用户头像 提问 2015年 2月20日 @ Xin Zhao 中士 (1,070 威望)
0 投票
1 回复 147 阅读
0 投票
1 回复 70 阅读
0 投票
1 回复 41 阅读
用户头像 提问 2017年 2月28日 @ Vi 下士 (826 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...