MongoDB - 数组更新操作符:$、$[]、$pop、$pull、$push、$each、$sort、$slice、$position

文章目录

    • 1. $
      • 1. 更新数组中的值
      • 2. 更新数组中的嵌入文档
    • 2. $[]
      • 1. 更新数组中的所有元素
      • 2. 更新数组中的所有嵌入文档
    • 3. $pop
      • 1. 删除数组的第一个元素
      • 2. 删除数组的最后一个元素
    • 4. $pull
      • 1. 删除所有等于指定值的项
      • 2. 删除与指定条件匹配的所有项
      • 3. 从文档数组中删除项
      • 4. 从嵌套数组中删除文档
    • 5. $push
      • 1. $push 将值追加到数组
      • 2. $push 与 $each
      • 3. $push 与 $each 与 $positon
      • 4. $slice
      • 5. $push 与 $slice
      • 6. $push 与 $sort
      • 7. $push 与 $each 与 $position 与 $sort 与 $slice

$:充当占位符,用于更新与查询条件匹配的第一个元素。

$[]:充当占位符,以更新数组中与查询条件匹配的文档中的所有元素。

$[<identifier>]:充当占位符,以更新与查询条件匹配的文档中所有符合 arrayFilters 条件的元素。

$addToSet:类似于 $push,但是只会向数组字段添加不存在的元素。

$pop:用于从数组字段中删除第一个或最后一个元素。

$pull:用于从数组字段中删除符合指定条件的元素。

$push:用于向数组字段添加元素。

$pullAll:用于从数组字段中删除包含在指定数组中的所有元素。

1. $

$ 将数组中匹配到的第一个元素更新为指定的值。

db.collection.updateOne({ <array>: value ... },{ <update operator>: { "<array>.$" : value } }
)

具体解释如下:

  • <update operator>:表示要使用的更新操作符,例如 s e t 、 set、 setinc、$push等。
  • <array>.$”:表示要更新的数组字段,其中<array>是数组字段的名称,$表示匹配到的第一个元素。
  • value:表示要更新的值。

使用这个语法可以将数组中匹配到的第一个元素更新为指定的值。请注意,这个语法只能用于更新数组中匹配到的第一个元素,无法用于更新数组中的所有元素。如果需要更新数组中的所有元素,可以使用<array>.$[]语法。

1. 更新数组中的值

构造测试数据:

db.students.drop()
db.students.insertMany( [{ "_id" : 1, "grades" : [ 85, 80, 80 ] },{ "_id" : 2, "grades" : [ 88, 90, 92 ] },{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
] )

查询 students 集合中 _id=1 并且 grades 数组包含80 的文档,将 grades 数组中第一个值为80的元素更新为82,如果不知道该元素在数组中的位置,$操作符:

db.students.updateOne({ _id: 1, grades: 80 },{ $set: { "grades.$" : 82 } }
)db.students.find({_id: 1})

如果知道该元素在数组中的位置 ,就可以直接使用数组元素的索引:

db.students.updateOne({ _id: 1, grades: 80 },{ $set: { "grades.1" : 82 } }
)

查询结果:

{"_id": 1,"grades": [85,82,80]
}

SpringBoot整合mongoDB 实现以上查询操作:

@Data
@Document(collection = "students")
public class Student {@Idprivate int id;private List<Integer> grades;
}
@Test
public void updateUser(){// 构建查询条件Query query = new Query();query.addCriteria(Criteria.where("_id").is(1).and("grades").is(80));// 构建更新操作Update update = new Update();update.set("grades.$", 82);// 执行更新操作mongoTemplate.updateFirst(query, update, "students");
}

2. 更新数组中的嵌入文档

db.collection.updateOne({ <query selector> },{ <update operator>: { "array.$.field" : value } }
)

构造测试数据:

db.students.insertOne({_id: 4,course: [{ grade: 80, mean: 75, std: 8 },{ grade: 85, mean: 90, std: 5 },{ grade: 85, mean: 85, std: 8 }]}
)

查询 _id=4 且 course.grade 包含85的文档,将 course 数组中第一个 grade=85 的文档的 std 字段更新为6,如果不知道该元素在数组中的位置,就可以使用位置$操作符:

db.students.updateOne({ _id: 4, "course.grade": 85 },{ $set: { "course.$.std" : 6 } }
)db.students.find({_id: 4})

查询结果:

{"_id": 4,"course": [{"grade": 80,"mean": 75,"std": 8},{"grade": 85,"mean": 90,"std": 6},{"grade": 85,"mean": 85,"std": 8}]
}

如果知道该元素在数组中的位置 ,就可以直接使用数组元素的索引:

db.students.updateOne({ _id: 4, "course.grade": 85 },{ $set: { "course.1.std" : 6 } }
)

SpringBoot整合mongoDB 实现以上查询操作:

@Data
@Document(collection = "students")
public class Student {@Idprivate int id;private List<Integer> grades;private List<Grade> course;@Datapublic static class Grade {private int grade;private int mean;private int std;}
}
@Test
public void updateUser(){// 构建查询条件Query query = new Query();query.addCriteria(Criteria.where("_id").is(4).and("course.grade").is(85));// 构建更新操作Update update = new Update();update.set("course.$.std", 6);// 执行更新操作mongoTemplate.updateFirst(query, update, "students");
}

2. $[]

$[] 将数组中的所有元素都更新为指定的值。

db.collection.updateOne({ <query conditions> },{ <update operator>: { "<array>.$[]" : value } }
)

具体解释如下:

  • <update operator>:表示要使用的更新操作符,例如 s e t 、 set、 setinc、$push等。
  • <array>.$[]”:表示要更新的数组字段,其中<array>是数组字段的名称,$[]表示匹配数组中的所有元素。
  • value:表示要更新的值。

使用这个语法可以将数组中的所有元素都更新为指定的值。请注意,这个语法只能用于更新数组中的所有元素,无法用于更新数组中的部分元素。

1. 更新数组中的所有元素

构造测试数据:

db.students.insertMany( [{ "_id" : 1, "grades" : [ 85, 82, 80 ] },{ "_id" : 2, "grades" : [ 88, 90, 92 ] },{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
] )

查询 students 集合中的所有文档,将 grades 数组中的所有元素都增加10,其中$[]表示匹配数组中的所有元素:

db.students.updateMany({ },{ $inc: { "grades.$[]": 10 } },
)db.students.find()

查询结果:

// 1
{"_id": 1,"grades": [95,92,90]
}// 2
{"_id": 2,"grades": [98,100,102]
}// 3
{"_id": 3,"grades": [95,110,100]
}

SpringBoot 整合 mongoDB 实现以上查询操作:

@Data
@Document(collection = "students")
public class Student {@Idprivate int id;private List<Integer> grades;
}
@Test
public void updateUser(){// 构建查询条件Query query = new Query();// 构建更新操作Update update = new Update();update.inc("grades.$[]", 10);// 执行更新操作mongoTemplate.updateMulti(query, update, "students");
}

2. 更新数组中的所有嵌入文档

db.collection.updateOne({ <query selector> },{ <update operator>: { "array.$[].field" : value } }
)

构造测试数据:

db.students.insertMany( [{"_id" : 1,"course" : [{ "grade" : 80, "mean" : 75, "std" : 8 },{ "grade" : 85, "mean" : 90, "std" : 6 },{ "grade" : 85, "mean" : 85, "std" : 8 }]},{"_id" : 2,"course" : [{ "grade" : 90, "mean" : 75, "std" : 8 },{ "grade" : 87, "mean" : 90, "std" : 5 },{ "grade" : 85, "mean" : 85, "std" : 6 }]}
] )

查询 students 集合中的所有文档,将 course 数组中的所有元素的std字段都增加10,其中$[]表示匹配数组中的所有元素:

db.students.updateMany({ },{ $inc: { "course.$[].std" : -2 } },
)db.students.find()

查询结果:

// 1
{"_id": 1,"course": [{"grade": 80,"mean": 75,"std": 18},{"grade": 85,"mean": 90,"std": 16},{"grade": 85,"mean": 85,"std": 18}]
}// 2
{"_id": 2,"course": [{"grade": 90,"mean": 75,"std": 18},{"grade": 87,"mean": 90,"std": 15},{"grade": 85,"mean": 85,"std": 16}]
}

SpringBoot 整合 MongoDB 实现以上查询操作:

@Data
@Document(collection = "students")
public class Student {@Idprivate int id;private List<Integer> grades;private List<Grade> course;@Datapublic static class Grade {private int grade;private int mean;private int std;}
}
@SpringBootTest
@RunWith(SpringRunner.class)
public class BeanLoadServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testpublic void updateUser(){// 构建查询条件Query query = new Query();// 构建更新操作Update update = new Update();update.inc("course.$[].std", 10);// 执行更新操作mongoTemplate.updateMulti(query, update, "students");}
}

3. $pop

$pop 从数组字段中删除第一个或最后一个元素。

db.collection.updateOne(<query>, { $pop: { <field>: <-1 | 1>, ... } }
)

<field>是要操作的数组字段,<-1 | 1>表示删除的方向,-1表示删除第一个元素,1表示删除最后一个元素。

1. 删除数组的第一个元素

构造测试数据:

db.students.insertOne( { _id: 1, grades: [ 8, 9, 10 ] } )

查询 students 集合中 _id=1 的文档,将 grades 数组中的第一个元素删除:

db.students.updateOne({ _id: 1 }, { $pop: { grades: -1 } } 
)db.students.find({_id:1})

查询结果:

{"_id": 1,"grades": [9,10]
}

SpringBoot 整合 MongoDB 实现以上查询操作:

@Data
@Document(collection = "students")
public class Student {@Idprivate int id;private List<Integer> grades;
}
@Test
public void updateUser(){// 构建查询条件Query query = new Query(Criteria.where("_id").is(1));// 构建更新操作Update update = new Update();update.pop("grades",Update.Position.FIRST);// 执行更新操作mongoTemplate.updateMulti(query, update, "students");
}

2. 删除数组的最后一个元素

db.students.updateOne({ _id: 1 }, { $pop: { grades: 1 } } 
)db.students.find({_id:1})

查询结果:

{"_id": 1,"grades": [ 9 ]
}

SpringBoot 整合 MongoDB 实现以上查询操作:

@Data
@Document(collection = "students")
public class Student {@Idprivate int id;private List<Integer> grades;
}
@Test
public void updateUser(){// 构建查询条件Query query = new Query(Criteria.where("_id").is(1));// 构建更新操作Update update = new Update();update.pop("grades",Update.Position.LAST);// 执行更新操作mongoTemplate.updateMulti(query, update, "students");
}

4. $pull

$pull 是 MongoDB 的更新操作符,用于从数组字段中删除匹配的元素。

db.collection.updateOne(<query>, { $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } }
)

从数组字段中删除匹配的元素。以下是该语法的解释:

  • <field1>, <field2>, ... 是要进行更新的字段名。
  • <value|condition> 是要从数组字段中删除的元素值或删除的条件。

1. 删除所有等于指定值的项

构造测试数据:

db.stores.insertMany( [{_id: 1,fruits: [ "apples", "pears", "oranges", "grapes", "bananas" ],vegetables: [ "carrots", "celery", "squash", "carrots" ]},{_id: 2,fruits: [ "plums", "kiwis", "oranges", "bananas", "apples" ],vegetables: [ "broccoli", "zucchini", "carrots", "onions" ]}
] )

① 删除 stores 集合中vegetables 数组中的 "carrots":

db.stores.updateMany({ },{ $pull: { vegetables: "carrots" } }
)db.stores.find()

查询结果:

// 1
{"_id": 1,"fruits": ["apples","pears","oranges","grapes","bananas"],"vegetables": ["celery","squash"]
}// 2
{"_id": 2,"fruits": ["plums","kiwis","oranges","bananas","apples"],"vegetables": ["broccoli","zucchini","onions"]
}

SpringBoot 整合 MongoDB 实现以上查询操作:

@Data
@Document(collection = "stores")
public class Store {@Idprivate int id;private List<String> fruits;private List<String> vegetables;
}
@Test
public void updateStore(){// 构建查询条件Query query = new Query();// 构建更新操作Update update = new Update();update.pull("vegetables","carrots");// 执行更新操作mongoTemplate.updateMulti(query, update, "stores");
}

② 删除 stores 集合中 fruits 数组中的 "apples""oranges"

db.stores.updateMany({ },{ $pull: { fruits: { $in: [ "apples", "oranges" ] } } }
)

查询结果:

// 1
{"_id": 1,"fruits": ["pears","grapes","bananas"],"vegetables": ["carrots","celery","squash","carrots"]
}// 2
{"_id": 2,"fruits": ["plums","kiwis","bananas"],"vegetables": ["broccoli","zucchini","carrots","onions"]
}

SpringBoot 整合 MongoDB 实现以上查询操作:

@Data
@Document(collection = "stores")
public class Store {@Idprivate int id;private List<String> fruits;private List<String> vegetables;
}
@Test
public void updateStore(){// 构建查询条件Query query = new Query();// 构建更新操作String[] values = new String[]{ "apples", "oranges"};Update update = new Update();update.pullAll("fruits", values);// 执行更新操作mongoTemplate.updateMulti(query, update, "stores");
}

③ 删除 stores 集合中fruits 数组中的 "apples""oranges"vegetables 数组中的 "carrots"

db.stores.updateMany({ },{ $pull: { fruits: { $in: [ "apples", "oranges" ] }, vegetables: "carrots" } }
)

查询结果:

// 1
{"_id": 1,"fruits": ["pears","grapes","bananas"],"vegetables": ["celery","squash"]
}// 2
{"_id": 2,"fruits": ["plums","kiwis","bananas"],"vegetables": ["broccoli","zucchini","onions"]
}

SpringBoot 整合 MongoDB 实现以上查询操作:

@Data
@Document(collection = "stores")
public class Store {@Idprivate int id;private List<String> fruits;private List<String> vegetables;
}
@Test
public void updateStore(){// 构建查询条件Query query = new Query();// 构建更新操作String[] values = new String[]{ "apples", "oranges"};Update update = new Update();update.pull("vegetables","carrots");update.pullAll("fruits", values);// 执行更新操作mongoTemplate.updateMulti(query, update, "stores");
}

2. 删除与指定条件匹配的所有项

构造测试数据:

db.students.insertMany( [{ "_id" : 1, "grades" : [ 85, 80, 80 ] },{ "_id" : 2, "grades" : [ 88, 90, 92 ] },{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
] )

查询 _id=1的文档,将 grades 数组中大于80 的所有项删除 :

db.students.updateOne( { _id: 1 }, { $pull: { grades: { $gt: 80 } } } )
db.students.find()

查询结果:

// 1
{"_id": 1,"grades": [80,80]
}// 2
{"_id": 2,"grades": [88,90,92]
}// 3
{"_id": 3,"grades": [85,100,90]
}

SpringBoot 整合 MongoDB 实现以上查询操作:

@Data
@Document(collection = "students")
public class Student {@Idprivate int id;private List<Integer> grades;
}
@Test
public void updateUser(){// 构建查询条件Query query = new Query(Criteria.where("_id").is(1));// 构建更新操作Update update = new Update();update.pull("grades", Query.query(Criteria.where("grades").gt(80)));// 执行更新操作mongoTemplate.updateMulti(query, update, "students");
}

3. 从文档数组中删除项

构造测试数据:

db.survey.insertMany([{_id: 1,results: [{ item: "A", score: 5 },{ item: "B", score: 8 }]},{_id: 2,results: [{ item: "C", score: 8 },{ item: "B", score: 4 }]}
] )

删除 results 数组中 score=8 并且 item=“B” 的文档:

db.survey.updateMany({ },{ $pull: { results: { score: 8 , item: "B" } } }
)db.survey.find()

查询结果:

// 1
{"_id": 1,"results": [{"item": "A","score": 5}]
}// 2
{"_id": 2,"results": [{"item": "C","score": 8},{"item": "B","score": 4}]
}

SpringBoot 整合 MongoDB 实现以上查询操作:

@Data
@Document(collection = "survey")
public class Survey {@Idprivate int id;private List<Result> results;@Datapublic class Result {private String item;private int score;}
}
@Test
public void updateResult(){// 构建查询条件Query query = new Query();// 构建更新操作Update update = new Update();update.pull("results", Query.query(Criteria.where("score").is(8).and("item").is("B")));// 执行更新操作mongoTemplate.updateMulti(query, update, "survey");
}

4. 从嵌套数组中删除文档

构造测试数据:

db.survey.drop()db.survey.insertMany( [{_id: 1,results: [{item: "A",score: 5,answers: [ { q: 1, a: 4 }, { q: 2, a: 6 } ]},{item: "B",score: 8,answers: [ { q: 1, a: 8 }, { q: 2, a: 9 } ]}]},{_id: 2,results: [{item: "C",score: 8,answers: [ { q: 1, a: 8 }, { q: 2, a: 7 } ]},{item: "B",score: 4,answers: [ { q: 1, a: 0 }, { q: 2, a: 8 } ]}]}
] )

删除 results 数组中的 answers 数组中 q=2 并且 a>=8 的文档:

db.survey.updateMany({ },{$pull:{results:{answers: { $elemMatch: { q: 2, a: { $gte: 8 } } }}}}
)db.survey.find()

查询结果:

// 1
{"_id": 1,"results": [{"item": "A","score": 5,"answers": [{"q": 1,"a": 4},{"q": 2,"a": 6}]}]
}// 2
{"_id": 2,"results": [{"item": "C","score": 8,"answers": [{"q": 1,"a": 8},{"q": 2,"a": 7}]}]
}

SpringBoot 整合 MongoDB 实现以上查询操作:

@Data
@Document(collection = "survey")
public class Survey {@Idprivate int id;private List<Result> results;@Datapublic class Result {private String item;private int score;private List<Answer> answers;}@Datapublic class Answer {private int q;private int a;}
}
@Test
public void updateResult(){// 构建查询条件Query query = new Query();// 构建更新操作Update update = new Update();update.pull("results", Query.query(Criteria.where("answers").elemMatch(Criteria.where("q").is(2).and("a").gte(8))));// 执行更新操作mongoTemplate.updateMulti(query, update, "survey");
}

5. $push

$push 支持一次向多个数组字段添加元素的功能:

{ $push: { <field1>: <value1>, <field2>: <value2>, ... } }

其中,<field1>、<field2>等是要更新的数组字段,<value1>、<value2>等是要添加到对应数组中的元素。

您可以使用 $push 操作符与以下修饰符一起使用:

修饰符说明
$each向数组字段追加多个值。
$slice限制数组元素的数量。
$sort对数组元素进行排序。
$position指定数组中插入新元素的位置。如果没有 $position 修饰符,$push 会将元素追加到数组的末尾。

1. $push 将值追加到数组

构造测试数据:

db.students.insertOne( { _id: 1, grades: [ 44, 78, 38, 80 ] } )

向 _id=1 文档的 grades 数组中追加一个元素 89:

db.students.updateOne({ _id: 1 },{ $push: { grades: 89 } }
)db.students.findOne()

查询结果:

// 1
{"_id": 1,"grades": [44,78,38,80,89]
}

SpringBoot 整合 MongoDB 实现以上查询操作:

@Data
@Document(collection = "students")
public class Student {@Idprivate int id;private List<Integer> grades;
}
@Test
public void updateStudent(){// 构建查询条件Query query = new Query();query.addCriteria(Criteria.where("_id").is(1));// 构建更新操作Update update = new Update();update.push("grades",89);// 执行更新操作mongoTemplate.updateMulti(query, update, "students");
}

构造测试数据:

db.students.drop()db.students.insertOne( { _id: 1, grades: [ 44, 78, 38, 80 ] } )db.students.insertMany( [{ _id: 2, grades: [ 45, 78, 38, 80, 89 ] } ,{ _id: 3, grades: [ 46, 78, 38, 80, 89 ] } ,{ _id: 4, grades: [ 47, 78, 38, 80, 89 ] }
] )

向每个文档的 scores 数组追加一个元素 95:

db.students.updateMany({ },{ $push: { grades: 95 } }
)db.students.find();

查询结果:

[{ _id: 1, grades: [ 44, 78, 38, 80, 89, 95 ] },{ _id: 2, grades: [ 45, 78, 38, 80, 89, 95 ] },{ _id: 3, grades: [ 46, 78, 38, 80, 89, 95 ] },{ _id: 4, grades: [ 47, 78, 38, 80, 89, 95 ] }
]

SpringBoot 整合 MongoDB 实现以上查询操作:

@Data
@Document(collection = "students")
public class Student {@Idprivate int id;private List<Integer> grades;
}
@Test
public void updateStudent(){// 构建查询条件Query query = new Query();// 构建更新操作Update update = new Update();update.push("grades",89);// 执行更新操作mongoTemplate.updateMulti(query, update, "students");
}

2. $push 与 $each

使用 $push$each 修饰符将多个值附加到数组字段。

向 _id=1 文档的 grades 数组中追加多个值 [ 90, 92, 85 ]:

db.students.drop()db.students.insertMany( [{ "_id" : 1, "grades" : [ 85, 80, 80 ] },{ "_id" : 2, "grades" : [ 88, 90, 92 ] },{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
] )db.students.updateOne({ _id: 1 },{ $push: { grades: { $each: [ 90, 92, 85 ] } } }
)db.students.find({_id:1})

查询结果:

{ _id: 1, grades: [ 44, 78, 38, 80, 89, 95, 90, 92, 85 ] }

SpringBoot整合MongoDB实现:

@Data
@Document(collection = "students")
public class Student {@Idprivate int id;private List<Integer> grades;
}
@Test
public void updateResult(){// 构建查询条件Query query = new Query(Criteria.where("_id").is(1));// 构建更新操作Update update = new Update();update.push("grades").each(90,92,95);// 执行更新操作mongoTemplate.updateMulti(query, update, "students");
}

3. $push 与 $each 与 $positon

使用 $each,可以将一个包含多个元素的数组添加到目标数组字段中,使用 $positon 可以指定插入元素的数组位置。

{$push: {<arrayField>: {$each: [ <value1>, <value2>, ... ],$position: <num>}}
}

构造测试数据:

db.students.drop()db.students.insertMany( [{ "_id" : 1, "grades" : [ 85, 80, 80 ] },{ "_id" : 2, "grades" : [ 88, 90, 92 ] },{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
] )

向 grades 数组索引为1的位置添加 50,60,70 三个值:

db.students.updateOne({ _id: 1 },{$push: {grades: {$each: [ 50, 60, 70 ],$position: 1}}}
)db.students.find({_id:1})

查询结果:

// 1
{"_id": 1,"grades": [85,50,60,70,80,80]
}

SpringBoot 整合 MongoDB 实现:

@Data
@Document(collection = "students")
public class Student {@Idprivate int id;private List<Integer> grades;
}
@Test
public void updateResult(){// 构建查询条件Query query = new Query(Criteria.where("_id").is(5));// 构建更新操作Update update = new Update().push("grades").atPosition(1).each(50,60,70);// 执行更新操作mongoTemplate.updateMulti(query, update, "students");
}

4. $slice

$slice 用于在查询结果中限制数组字段的元素数量,如果num为正数则从前往后数,如果num为负数则从后往前数。

{ arrayField: {  $slice: <num>} }

构造测试数据:

db.students.drop()db.students.insertMany( [{ "_id" : 1, "grades" : [ 85, 80, 80 ] },{ "_id" : 2, "grades" : [ 88, 90, 92 ] },{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
] )

查询 grades 数组中的前2个元素:

db.students.find({ _id: 1 },{ grades: { $slice: 2 } }
)

查询结果:

{ "_id" : 1, "grades" : [ 85, 80] }

查询 scores 数组中的后2个元素:

db.students.find({ _id: 1 },{ scores: { $slice: -2 } }
)

查询结果:

{ "_id" : 1, "grades" : [ 80, 80] }

5. $push 与 $slice

{$push: {<arrayField>: {$each: [ <value1>, <value2>, ... ],$slice: <num>}}
}

构造测试数据:

db.students.drop()db.students.insertMany( [{ "_id" : 1, "grades" : [ 85, 80, 80 ] },{ "_id" : 2, "grades" : [ 88, 90, 92 ] },{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
] )

向 grades数组索引为 0 的位置添加10,20,30三个元素,并返回数组的前2个元素:

db.students.updateOne({ _id: 1 },{$push: {grades: {$each: [ 10, 20, 30 ],$position: 0,$slice: 2}}}
)db.students.find({_id:1})

查询结果:

{"_id": 1,"grades": [10,20]
}

SpringBoot 整合 MongoDB 实现:

@Data
@Document(collection = "students")
public class Student {@Idprivate int id;private List<Integer> grades;
}
@Test
public void updateResult(){// 构建查询条件Query query = new Query(Criteria.where("_id").is(5));// 构建更新操作Update update = new Update().push("grades").atPosition(1).each(50,60,70);// 执行更新操作mongoTemplate.updateMulti(query, update, "students");
}

6. $push 与 $sort

$sort 修饰符在 $push 操作期间对数组的元素进行排序。要使用 $sort 修饰符,它必须与 $each 修饰符同时出现:

{$push: {<field>: {$each: [ <value1>, <value2>, ... ],$sort: <sort specification>}}
}

构造测试数据:

db.students.drop()db.students.insertOne({"_id": 1,"quizzes": [{ "id" : 1, "score" : 6 },{ "id" : 2, "score" : 9 }]}
)

以下更新将其他文档附加到 quizzes 数组,按 score 字段对数组的所有元素进行升序排序:

db.students.updateOne({ _id: 1 },{$push: {quizzes: {$each: [ { id: 3, score: 8 }, { id: 4, score: 7 }, { id: 5, score: 6 } ],$sort: { score: 1 }}}}
)db.students.find()

查询结果:

// 1
{"_id": 1,"quizzes": [{"id": 1,"score": 6},{"id": 5,"score": 6},{"id": 4,"score": 7},{"id": 3,"score": 8},{"id": 2,"score": 9}]
}

SpringBoot 整合 MongoDB:

@Data
@Document(collection = "students")
public class Student {@Idprivate int id;@AllArgsConstructor@NoArgsConstructor@Datapublic static class Quiz {private int wk;private int score;}
}
@Test
public void updateResult(){// 构建查询条件Query query = new Query(Criteria.where("_id").is(1));// 构建更新操作Update update = new Update().push("quizzes").sort(Sort.by(Sort.Direction.ASC, "score")).each(new Student.Quiz(3,8),new Student.Quiz(4,7),new Student.Quiz(5,6));// 执行更新操作mongoTemplate.updateMulti(query, update, "students");
}

构造测试数据 :

db.students.drop()db.students.insertMany( [{ "_id" : 1, "grades" : [ 85, 80, 80 ] },{ "_id" : 2, "grades" : [ 88, 90, 92 ] },{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
] )

向grades数组中添加元素40,60,按 score 字段对数组的所有元素进行升序排序:

db.students.updateOne({ _id: 2 },{ $push: { grades: { $each: [ 40, 60 ], $sort: 1 } } }
)db.students.find()

查询结果:

// 1
{"_id": 1,"grades": [85,80,80]
}// 2
{"_id": 2,"grades": [40,60,88,90,92]
}// 3
{"_id": 3,"grades": [85,100,90]
}

SpringBoot 整合 MongoDB:

@Data
@Document(collection = "students")
public class Student {@Idprivate int id;private List<Integer> grades;
}
@Test
public void updateResult(){// 构建查询条件Query query = new Query(Criteria.where("_id").is(2));// 构建更新操作Update update = new Update().push("grades").sort(Sort.Direction.ASC).each(40,60);// 执行更新操作mongoTemplate.updateMulti(query, update, "students");
}

7. $push 与 $each 与 $position 与 $sort 与 $slice

构造测试数据:

db.students.drop()db.students.insertOne({"_id" : 5,"quizzes" : [{ "wk": 1, "score" : 10 },{ "wk": 2, "score" : 8 },{ "wk": 3, "score" : 5 },{ "wk": 4, "score" : 6 }]}
)

以下 $push 操作使用:

  • $each 修饰符,将多个文档添加到 quizzes 数组。
  • $position修饰符,将多个文档添加到 quizzes 数组索引为0的位置。
  • $sort 修改符,对 quizzes 数组按照 score 字段降序排序。
  • $slice 修饰符,仅保留 quizzes 数组中的前3个元素。
db.students.updateOne({ _id: 5 },{$push: {quizzes: {$each: [ { wk: 5, score: 8 }, { wk: 6, score: 7 }, { wk: 7, score: 6 } ],$position: 0,$sort: { score: -1 },$slice: 3}}}
)db.students.find({_id:5})

查询结果:

{"_id" : 5,"quizzes" : [{ "wk" : 1, "score" : 10 },{ "wk" : 5, "score" : 8 },{ "wk" : 2, "score" : 8 }]
}

SpringBoot整合MongoDB实现:

public class Student {@Idprivate int id;private List<Integer> grades;private List<Quiz> quizzes;@AllArgsConstructor@NoArgsConstructor@Datapublic static class Quiz {private int wk;private int score;}
}
@Test
public void updateResult(){// 构建查询条件Query query = new Query(Criteria.where("_id").is(5));// 构建更新操作Update update = new Update().push("quizzes").atPosition(0).slice(3).sort(Sort.by(Sort.Direction.DESC, "score")).each(new Student.Quiz(5,8), new Student.Quiz(6,7), new Student.Quiz(7,6));// 执行更新操作mongoTemplate.updateMulti(query, update, "students");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/49944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨棒距、公法线和齿厚对应关系分析

前面有一期讨论了下滚齿径向进刀量和齿厚的对应关系&#xff1a;《》&#xff0c;有小伙伴又问了&#xff0c;加工时是用跨棒距或者公法线去控制齿厚的&#xff0c;直接给齿厚是无法测量的&#xff0c;如果测一个值再去计算&#xff0c;有点麻烦&#xff0c;有没有他们之间的对…

多多OJ评测系统 在前端脚手架Vue-Cli中设置页面路由

目录 设置页面路由 我们把菜单上的路由改成读取路由文件 设置成export 导出路由 在刚刚的原始路由 index.ts中导入就行了 在这边引入我们的路由文件 我们之后点击菜单 我们的路由文件是这样的 但是没有跳转 写一下事件 接下来要同步路由到菜单项 自己定义监听函数 …

【Springboot starter 组件开发】限流组件 RateLimiter

【Springboot starter 组件开发】限流组件 RateLimiter 一、摘要二、基于guava实现2.1 核心依赖2.2 核心逻辑 三、基于Redis lua脚本实现3.1 核心依赖3.2 核心逻辑 一、摘要 基于guava的RateLimiter&#xff0c;实现限流基于redis lua脚本(推荐&#xff0c;准确性高)&#x…

推荐3款不可错过的实用工具

TouchPro TouchPro是一款运行于Windows系统下的时间属性修改工具&#xff0c;其主要功能是允许用户批量修改文件和文件夹的创建时间、修改时间和访问时间。该软件安装后会集成到资源管理器中&#xff0c;不占用任何系统资源&#xff0c;并支持多级目录与隐藏文件的日期属性批量…

mysql数据迁移,全量和增量

mysql是常用的数据库。数据迁移一般有2种&#xff0c;增量数据和历史数据。 假设我有2个数据库mysqlA和mysqlB。 mysqlB是新的数据库&#xff0c;mysqlA是旧的数据库。 A->B。首先我们选定一个时间为历史数据。将这部分的数据全部输入到B里。 接下来将服务切换的B库。然后…

推荐几款支持AI剪辑并可使用个人视频素材的软件!

最强AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量 其实现在大部分的AI视频剪辑工具都可以实现一键成片&#xff0c;这里给你分享6款可以使用自己的素材实现AI剪辑的工具及其操作方法&#xff01; 一、剪映 剪映…

服务器重启了之后就卡在某个页面了,花屏,如何解决??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

C++:完美转发和可变参数模板

完美转发和可变参数模板 (1)完美转发 A.What&#xff08;什么是完美转发&#xff09; 某些函数将其一个或多个实参连同其类型不变地转发给其它函数&#xff0c;我们需要保证被转发实参的所有性质&#xff0c;这种保证转发实参所有性质的参数传递&#xff0c;我们称之为“完美…

前端开发知识(二)-css

<head> <style> div{ } </style> </head> div是布局标签&#xff0c; 一般放在head标签内&#xff0c;最下部。 若直接在在.css文件中写css,文件中&#xff0c;直接写就行&#xff0c;如下所示。 div{ }

MySQL数据库安装使用

我们都知道数据库又分为关系型数据库和非关系型数据库&#xff1b; 关系型数据库指采用了关系模型来组织数据的数据库&#xff0c;指的就是二维表格模型。可以先初步理解为Excel表格。非关系型数据库又被称为NoSQL&#xff0c;对NoSQL 最普遍的定义是“非关联型的”&#xff0…

C语言 | Leetcode C语言题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; // 判断是否为完全平方数 bool isPerfectSquare(int x) {int y sqrt(x);return y * y x; }// 判断是否能表示为 4^k*(8m7) bool checkAnswer4(int x) {while (x % 4 0) {x / 4;}return x % 8 7; }int numSquares(int n) {if (isPerfect…

JAVA零基础小白自学日志——第二十三天

文章目录 1.访问范围权限关键字2.private&#xff08;私有&#xff09;3.default&#xff08;默认&#xff09;4.protected&#xff08;受保护的&#xff09;5.public&#xff08;公共&#xff09; 今日摘要&#xff1a;再谈访问范围 1.访问范围权限关键字 项目同一个类同一个…

Linux环境安装KubeSphere容器云平台并实现远程访问Web UI 界面

文章目录 前言1. 部署KubeSphere2. 本地测试访问3. Linux 安装Cpolar4. 配置KubeSphere公网访问地址5. 公网远程访问KubeSphere6. 固定KubeSphere公网地址 前言 本文主要介绍如何在Linux CentOS搭建KubeSphere并结合Cpolar内网穿透工具&#xff0c;实现远程访问&#xff0c;根…

HTTP请求入参类型解读

HTTP请求入参类型解读 Content-Type 在HTTP请求中&#xff0c;Content-Type请求头用于指示资源的MIME类型&#xff0c;即请求体的媒体类型。它告诉服务器实际发送的数据类型是什么&#xff0c;以便服务器能够正确地解析和处理这些数据。Content-Type可以有多种值&#xff0c;…

服务器怎样减少带宽消耗的问题?

择业在使用服务器的过程中会消耗大量的带宽资源&#xff0c;而减少服务器的带宽消耗则可以帮助企业降低经济成本&#xff0c;同时还能够提高用户的访问速度&#xff0c;那么服务器怎样能减少带宽的消耗呢&#xff1f;本文就来带领大家一起来探讨一下吧&#xff01; 企业可以选择…

详解建造者(builder)模式的创建对象使用方式

目录 抽象类代码导入依赖Pizza类Topping 枚举成员变量内部抽象类 BuilderBuilder 类的成员变量addTopping 方法&#xff1a;build 方法&#xff1a;self 方法&#xff1a;Pizza 类的构造函数&#xff1a; 实现类代码1. 导入Objects类2. NyPizza类3. Calzone类递归泛型类型stati…

C++ 类型转换 包括C风格的转换、static_cast、const_cast、reinterpret_cast、dynamic_cast、模板特化等

C 类型转换 包括C风格的转换、static_cast、const_cast、reinterpret_cast、dynamic_cast、模板特化等 flyfish 0. 隐式转换&#xff08;Implicit Conversions&#xff09; 隐式转换是编译器自动进行的类型转换&#xff0c;通常在需要将一个类型转换为另一个类型以匹配函数参…

kafka架构+原理+源码

1.安装jdk17 sudo yum -y update sudo wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm sudo yum -y install ./jdk-17_linux-x64_bin.rpm、 sudo java -version 2.安装kafka How to easily install kafka without zookeeper | Aditya’s Blog …

负载均衡工具haproxy完整安装部署流程 及 haproxy通过域名匹配进行负载-基于域名负载均衡的Haproxy配置

一、负载均衡工具haproxy完整安装部署流程 1. 关于负载均衡和haproxy 负载均衡是系统设计最常见的一种方式&#xff0c;Nginx、HAProxy、LVS、F5用得比较普遍&#xff0c;不过Nginx只能在HTTP层负载&#xff0c;而HAProxy即可以在7层做负载&#xff0c;也可以在4层做负载&…

一文了解AOL算子加速库

过去一年&#xff0c;随着ChatGPT的发布与快速迭代&#xff0c;基于大数据量、大参数量、大算力的预训练大模型已成为人工智能产业的主要路线。大模型的普及与发展不仅依靠模型本身的创新&#xff0c;更依赖于算力底座的支撑以及软件生态的繁荣&#xff0c;需要伙伴和开发者的积…