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方法似乎只接受一个(键,值),而不接受多值或值列表。
答案 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)
您需要findAndModify
。
那里的详细信息和说明:https://www.mkyong.com/mongodb/spring-data-mongodb-update-document/
https://docs.mongodb.com/manual/reference/method/db.collection.findAndModify
答案 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);
}