MongoDB内嵌文档查询修改实战操作

注意事项:
1、保存方法1
        val query = Query()
        query.addCriteria(Criteria.where("_id").`is`(doctor.doctorId))
        val json = objectMapper.writeValueAsString(doctor)
        val doc = Document.parse(json)
        if (!mongoTemplate.exists(query, "doctors")) {
            mongoTemplate.insert(doc, "doctors")
        }
        mongoTemplate.findAndReplace(query, doc, "doctors")
2、保存方法2
mongoTemplate.save(doctor)
使用方法1保存时:LocalDate=String。可以使用BigDecimal保存
使用方法1保存时:LocalDate=LocalDate。不可以使用BigDecimal保存
不支持继承后的重写属性!!!

 mongoTemplate实现内嵌文档查询修改操作

初始数据

{
    "_id": "drink",
    "product": "product",
    "type": [
        {
            "name": "Cake",
            "price": 10,
            "count": NumberInt("1"),
            "relevancy": [
                {
                    "spu": "spu1",
                    "sku": "sku4"
                },
                {
                    "spu": "spu1",
                    "sku": "sku5"
                },
                {
                    "spu": "spu3",
                    "sku": "sku6"
                }
            ]
        },
        {
            "name": "Coffee",
            "price": 2.5,
            "count": NumberInt("3"),
            "relevancy": [
                {
                    "spu": "spu1",
                    "sku": "sku4"
                },
                {
                    "spu": "spu1",
                    "sku": "sku5"
                },
                {
                    "spu": "spu3",
                    "sku": "sku6"
                }
            ]
        },
        {
            "name": "Tea",
            "price": 1.5,
            "count": NumberInt("2"),
            "relevancy": [
                {
                    "spu": "spu1",
                    "sku": "sku4"
                },
                {
                    "spu": "spu1",
                    "sku": "sku5"
                },
                {
                    "spu": "spu3",
                    "sku": "sku6"
                }
            ]
        }
    ]
}

demo

    @Operation(summary = "创建MongoDB测试数据", description = "创建MongoDB测试数据")
    @RequestMapping(value = ["/test"], method = [RequestMethod.GET])
    fun test(): Any? {
        data("drink", "spu1")
        data("food", "spu2")
        return JSONObject.toJSON(mongoTemplate.find(Query(), String::class.java, "TestData"))
    }

    fun data(id: String, spu: String) {
        data class Product(val spu: String, val sku: String)
        data class OrderItem(val name: String, val price: Double, val count: Int, val relevancy: List<Product>)

        val product = listOf<Product>(
            Product(spu, "sku4"),
            Product(spu, "sku5"),
            Product("spu3", "sku6")
        )
        val order = listOf<OrderItem>(
            OrderItem("Cake", price = 10.0, count = 1, product),
            OrderItem("Coffee", price = 2.5, count = 3, product),
            OrderItem("Tea", price = 1.5, count = 2, product)
        )
        val data = mapOf(
            "_id" to id,
            "product" to "product",
            "type" to order
        )
        val objectMapper = ApplicationJsonObjectMapper()
        val query = Query()
        query.addCriteria(Criteria.where("_id").`is`(data["_id"]))
        val json = objectMapper.writeValueAsString(data)
        val doc = Document.parse(json)
        if (!mongoTemplate.exists(query, "TestData")) {
            mongoTemplate.insert(doc, "TestData")
        }

        mongoTemplate.findAndReplace(query, doc, "TestData")
    }

    @Operation(summary = "MongoDB查询修改删除测试", description = "MongoDB查询修改删除测试")
    @RequestMapping(value = ["/test1"], method = [RequestMethod.GET])
    fun test1(): Any? {
        return data1()
    }

    fun data1(): Any? {
        data class OrderItem(val name: String, val price: Double, val count: Int)
        data class Product(val spu: String, val sku: String)

        val order = OrderItem("Xiao", price = 10000.0, count = 5000)
        val deleted = OrderItem("Cake", price = 10.0, count = 1)
        val product = Product("spu111", "sku111")
        val query = Query()
        query.addCriteria(Criteria.where("type.relevancy.spu").`is`("spu1"))
/*        val s = BasicDBObject()
        s["name"] = "Cake"
        val update: Update = Update().pull("type", s)*/  //文档删除操作
//        val update: Update = Update().set("type.$.", order)  //嵌套文档更新操作
        val update: Update = Update().set("type.$[].relevancy.$[i]", product).filterArray("i.spu", "spu1")  //嵌套文档中的嵌套文档更新操作
        mongoTemplate.updateMulti(query, update, "TestData")
        return JSONObject.toJSONString(mongoTemplate.find(query, String::class.java, "TestData"))
//        return mongoTemplate.updateFirst(query, update, "TestData")
    }

代码效果图

{
    "_id": "drink",
    "product": "product",
    "type": [
        {
            "name": "Cake",
            "price": 10,
            "count": NumberInt("1"),
            "relevancy": [
                {
                    "spu": "spu111",
                    "sku": "sku111"
                },
                {
                    "spu": "spu111",
                    "sku": "sku111"
                },
                {
                    "spu": "spu3",
                    "sku": "sku6"
                }
            ]
        },
        {
            "name": "Coffee",
            "price": 2.5,
            "count": NumberInt("3"),
            "relevancy": [
                {
                    "spu": "spu111",
                    "sku": "sku111"
                },
                {
                    "spu": "spu111",
                    "sku": "sku111"
                },
                {
                    "spu": "spu3",
                    "sku": "sku6"
                }
            ]
        },
        {
            "name": "Tea",
            "price": 1.5,
            "count": NumberInt("2"),
            "relevancy": [
                {
                    "spu": "spu111",
                    "sku": "sku111"
                },
                {
                    "spu": "spu111",
                    "sku": "sku111"
                },
                {
                    "spu": "spu3",
                    "sku": "sku6"
                }
            ]
        }
    ]
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值