Spring数据mongo删除子集合中的元素

时间:2018-02-01 08:10:02

标签: mongodb

我有这个文件:

{ 
    "_id" : ObjectId("5a698b8bc2539428e3738c7d"), 
    "_class" : "com.xxx.xxx.inf.dao.mongo.domain.IndexDO", 
    "product_id" : "5a67fde8c2539414b9712482", 
    "cn_name" : "index - test", 
    "en_name" : "test index - test", 
    "sample_desc" : "this is a sample description", 
    "people_type" : 1, 
    "ref_literature" : [
        {
            "_class" : "com.xxx.xxx.inf.dao.mongo.domain.RefLiterature", 
            "_id" : null, 
            "name" : "ref 1"
        }, 
        {
            "_class" : "com.xxx.xxx.inf.dao.mongo.domain.RefLiterature", 
            "_id" : null, 
            "name" : "ref 2"
        }
    ], 
    "user_id" : 6, 
    "gmt_create" : ISODate("2018-01-25T07:47:23.800+0000"), 
    "detail_desc" : null, 
    "gmt_modified" : ISODate("2018-01-25T07:49:50.923+0000"), 
    "index_level" : [
        {
            "_class" : "com.xxx.xxx.inf.dao.mongo.domain.IndexLevel", 
            "_id" : ObjectId("5a72c83050abd32e7e54340d"), 
            "up_val" : "3.2", 
            "down_val" : "5.7", 
            "calc_symbol_type" : 2, 
            "level_desc" : "this is a test level desc"
        }
    ]
}

我想删除index_level中的元素,这里是:

{
    "_class" : "com.xxx.xxx.inf.dao.mongo.domain.IndexLevel", 
    "_id" : ObjectId("5a72c83050abd32e7e54340d"), 
    "up_val" : "3.2", 
    "down_val" : "5.7", 
    "calc_symbol_type" : 2, 
    "level_desc" : "this is a test level desc"
}

我可以使用以下命令在mongo shell中删除此子文档:

db.index.update(
    {"_id":ObjectId("5a698b8bc2539428e3738c7d")}, 
    {$pull:{"index_level": {"_id":ObjectId("5a72c83050abd32e7e54340d")}}}
)

但是当我在下面删除使用mongotemplate代码时,我没有这样做:

mongoTemplate.updateFirst(                
    Query(Criteria.where("_id").`is`(ObjectId("5a698b8bc2539428e3738c7d"))),
                Update().pull("index_level", Query(Criteria.where("_id").`is`(ObjectId("5a72c83050abd32e7e54340d")))),
                IndexDO::class.java
        )

并尝试下面的代码:

mongoTemplate.updateFirst(
                Query(Criteria.where("_id").`is`(ObjectId("5a698b8bc2539428e3738c7d")).and("index_level._id").`is`(ObjectId("5a72c83050abd32e7e54340d"))),
                Update().pull("index_level", Query(Criteria.where("_id").`is`(ObjectId("5a72c83050abd32e7e54340d")))),
                IndexDO::class.java
        )

最后,我可以使用以下代码删除此子文档:

mongoTemplate.updateFirst(
                Query(Criteria.where("index_level._id").`is`(ObjectId("5a72c83050abd32e7e54340d"))),
                Update().pull("index_level", Query(Criteria.where("_id").`is`(ObjectId("5a72c83050abd32e7e54340d")))),
                IndexDO::class.java)

但是这段代码有问题,因为在这里位置字段是_id,当我更改位置字段时,如“calc_symbol_type”,最终代码将删除所有calc_symbol_type等于值我发送给方法。

所以问题是我错了吗?而mongo shell命令转换为mongotemplate代码将是什么?

谢谢!

0 个答案:

没有答案
相关问题