Spring数据MongoDB更新多个字段

时间:2018-06-25 14:59:16

标签: spring mongodb spring-data-mongodb

Spring-Data-MongoDB是否可以通过一个查询来更新文档的多个字段。

例如,我可以运行以下mongo查询:

db.customers.update(
  {"firstname": "Max"},
  { 
    $set: {
      "lastname": "Maier",
      "email": "p.maier@example.com"
    }
  }
);

我们如何使用代码和Spring MongoTemplate来实现这一目标? 例如,下面是叠加一个值的代码:

Query select = Query.query(Criteria.where("firstname").is("Max"));
        Update updateValue = Update.update("lastname", "Maier");
        UpdateResult updateResult = mongoTemplate.updateFirst(select, updateValue, Customer.class);

Update#set方法似乎只接受一个(键,值),而不接受多值或值列表。

4 个答案:

答案 0 :(得分:5)

  

似乎Update#set方法仅接受一个(键,值),并且   没有多值或值列表。

是的,它一次只接受一个键和一个值。但是您可以根据需要对许多键和值执行此操作。它就像一个地图,您可以根据需要添加任意数量的键(唯一)和值。

您只需要扩展一些代码

Query select = Query.query(Criteria.where("firstname").is("Max"));
Update update = new Update();
update.set("lastname", "Maier");
update.set("email", "p.maier@example.com");
UpdateResult updateResult = mongoTemplate.findAndModify(select, update, Customer.class);

如果您深入研究findAndModify方法,您可以了解它在幕后拿着键值映射。

答案 1 :(得分:3)

在我的版本中,findAndModifiy不返回UpdateResult。 我不得不使用方法updateMulti

Query select = Query.query(Criteria.where("firstname").is("Max"));
Update update = new Update();
update.set("lastname", "Maier");
update.set("email", "p.maier@example.com");
UpdateResult updateResult = mongoTemplate.updateMulti(select, update, Customer.class);

答案 2 :(得分:1)

答案 3 :(得分:0)

以下是使用MongoTemplate进行更新操作的等效实现。

用于更新一个文档对象的多个字段

CREATE PROCEDURE dbo.your_sp
    @input VARCHAR(max),
    @output VARCHAR(max) OUTPUT
AS 
PRINT 'PROC_START : dbo.your_sp'
-- Declare variables as needed
DECLARE @sp_output VARCHAR(max)
DECLARE @json_category VARCHAR(max)
DECLARE @json_category VARCHAR(max)

-- Validate JSON
IF(ISJSON(@input) = 0)
BEGIN
    SET @sp_output = '{"status":"Error","errorTitle":"Invalid Input JSON","errorMessage":"JSON sent as input is Incorrect, please verify and fix"}'
    
END
ELSE
BEGIN
    -- Process JSON if valid JSON provided
    -- Option 1
    INSERT INTO myTable
        (Field1, Field2)
    VALUES
    (
        SELECT [VALUE] FROM OPENJSON(@op, '$.category1') where [KEY] = 'field1',
        SELECT [VALUE] FROM OPENJSON(@op, '$.category1') where [KEY] = 'field1'
    )

    SET @sp_output = '{"status":"Success", "message":"Record updated successfully"}'


    -- Option 2 : Can have more validation for the data
    SELECT @json_category = VALUE FROM OpenJson (@input, '$') WHERE [Key] = 'category1'
    SELECT @json_field_value = VALUE FROM OpenJson (@json_category, '$') WHERE [Key] = 'field1'

    IF(@json_category IS NOT NULL OR @json_category <> '') AND (@json_field_value IS NOT NULL OR @json_field_value <> '')
    BEGIN
        INSERT INTO myTable
        (Field1, Field2)
        VALUES
        (
            SELECT [VALUE] FROM OPENJSON(@op, '$.category1') where [KEY] = 'field1',
            SELECT [VALUE] FROM OPENJSON(@op, '$.category1') where [KEY] = 'field1'
        )
        
        SET @sp_output = '{"status":"Success", "message":"Record updated successfully"}'

    END
    ELSE
    BEGIN

        SET @sp_output = '{"status":"Error","errorTitle":"Blank/Missing Input provided","errorMessage":"Critical / Mandatory data is missing in the input JSON"}'
    END

END


-- Build Output or Error response
SET @output = @sp_output
PRINT 'PROC_END : dbo.your_sp'
RETURN
GO

用于基于查询匹配将相同的更改更新到多个doc对象

   public Person update(Person person){
        Query query = new Query();
        query.addCriteria(Criteria.where("id").is(person.getId()));
        Update update = new Update();
        update.set("name", person.getName());
        update.set("description", person.getDescription());
        return mongoTemplate.findAndModify(query, update, Person.class);
    }