Mongo中的数组操作

当前mongo中有这么一条数据

book是一个数组,在他后面添加一条数据

{
  "_id" : ObjectId("5721f504d1f70435632b5ce7"),
  "qqqqq" : 5.0,
  "list" : {
    "school" : "驻马店第一高级中学",
    "age" : 22.0,
    "name" : "qiaoansheng"
  },
  "book" : ["C#大全", "干你妹三千"]
}

db.ansheng.update({"_id":ObjectId("5721f504d1f70435632b5ce7")},{"$push":{"book":"mongo权威指南"}})

执行完成后 mongo权威指南 完美的添加到了,这个数组的后面

 

/* 0 */
{
  "_id" : ObjectId("5721f504d1f70435632b5ce7"),
  "qqqqq" : 5.0,
  "list" : {
    "school" : "驻马店第一高级中学",
    "age" : 22.0,
    "name" : "qiaoansheng"
  },
  "book" : ["C#大全", "干你妹三千", "mongo权威指南"],
  "MyBook" : [{
      "bookName" : "干你妹三千",
      "money" : 188.0
    }, {
      "bookName" : "干你妹三千",
      "money" : 188.0
    }, {
      "bookName" : "mongo权威指南",
      "money" : 188.0
    }]
}

MyBook是一个集合,我要在这个集合后面追加一条数据

db.ansheng.update({"_id":ObjectId("5721f504d1f70435632b5ce7")},{"$push":{"MyBook":{"bookName":"在绝望中寻找希望","money":188}}})

 在集合或者数组后面追加多条数据

 db.ansheng.update({"name":"qiao"},{"$push":{"book":{"$each":["在绝望中寻找希望","C#大全"]}}}) 

 这是个数组后面追加多个数据,集合类似

 

 

{
  "_id" : ObjectId("5722941242c4872428edcc89"),
  "name" : "qiao",
  "book" : ["在绝望中寻找希望", "C#大全"],
  "Books" : [{
      "name" : "在绝望中寻找希望",
      "money" : 188.0
    }, {
      "name" : "C#大全",
      "money" : 77.0
    }]
}

book是一个数组,向这个数组后面追加一本书,如果这本书存在则不用追加,如果不存在则追加

 db.ansheng.update({"book":{"$ne":"在绝望中寻找希望"}},{"$push":{"book":"在绝望中寻找希望"}})

 db.ansheng.update({"name":"qiao"},{"$addToSet":{"book":"在绝望中寻找希望1"}})

 $addToSet 配合 $each 可以插入多条数据

 db.ansheng.update({"name":"qiao"},{"$addToSet":{"book":{"$each":["在绝望中寻找希望4","在绝望中寻找希望3"]}}})

 

删除一个元素

db.ansheng.update({"name":"qiao"},{"$pop":{"book":1}}) 删除最后一个元素

db.ansheng.update({"name":"qiao"},{"$pop":{"book":-1}})删除第一个元素

删除指定的元素

db.ansheng.update({"name":"qiao"},{"$pull":{"book":"在绝望中寻找希望4"}})

$pull会把所有匹配到的数据都删除掉,而不是只删除一个

 

 

添加和删除总结

在数组后面追加数据

db.ansheng.update({"_id":ObjectId("5721f504d1f70435632b5ce7")},{"$push":{"book":"mongo权威指南"}})

在集合后面追加数据

db.ansheng.update({"_id":ObjectId("5721f504d1f70435632b5ce7")},{"$push":{"MyBook":{"bookName":"在绝望中寻找希望","money":188}}})

在数组后面追加多条数据

db.ansheng.update({"name":"qiao"},{"$push":{"book":{"$each":["在绝望中寻找希望","C#大全"]}}})

在集合后面追加多条数据

db.ansheng.update({"name":"qiao"},{"$push":{"Books":{"$each":[{"name":"在绝望中寻找希望","money":188},{"name":"C#大全","money":77}]}}})

在数组后面追加数据,只有不存在才会追加

db.ansheng.update({"book":{"$ne":"在绝望中寻找希望"}},{"$push":{"book":"在绝望中寻找希望"}})

db.ansheng.update({"name":"qiao"},{"$addToSet":{"book":"在绝望中寻找希望1"}})

db.ansheng.update({"name":"qiao"},{"$addToSet":{"book":{"$each":["在绝望中寻找希望4","在绝望中寻找希望3"]}}})追加多条数据

删除数组第一个或者最后一个元素

db.ansheng.update({"name":"qiao"},{"$pop":{"book":1}}) 删除最后一个元素

db.ansheng.update({"name":"qiao"},{"$pop":{"book":-1}})删除第一个元素

删除指定的元素

db.ansheng.update({"name":"qiao"},{"$pull":{"book":"在绝望中寻找希望4"}})

 

 

 

数组中的查询

 

{"_id" : ObjectId("572aba3d734e0336c344e8bf"),"name" : ["C#大全", "权威指南", "我的梦想"]}
{"_id" : ObjectId("572aba3d734e0336c344e8c0"),"name" : ["权威指南", "我的梦想", "C#大全"]}
{"_id" : ObjectId("572aba3d734e0336c344e8c1"),"name" : ["我的梦想", "C#大全", "权威指南"]}
{"_id" : ObjectId("572aba3d734e0336c344e8c2"),"name" : ["C#大全", "权威1指南", "我的梦想"]}
{"_id" : ObjectId("572aba3d734e0336c344e8c3"),"name" : ["C#大全", "我的梦想"]}
现在有这么一个文档
db.as1.find({name:"C#大全"})//匹配到全部的数据
db.as1.find({name:"C#大全",name:"权威指南"})//匹配到三条数据
{"_id" : ObjectId("572aba3d734e0336c344e8bf"),"name" : ["C#大全", "权威指南", "我的梦想"]}
{"_id" : ObjectId("572aba3d734e0336c344e8c0"),"name" : ["权威指南", "我的梦想", "C#大全"]}
{"_id" : ObjectId("572aba3d734e0336c344e8c1"),"name" : ["我的梦想", "C#大全", "权威指南"]}
$all
要找到既有 "C#大全" 又有 "权威指南" 就要使用$all
db.as1.find({name:{"$all":["C#大全", "权威指南"]}})
但是我发现这个和上面那一个查询条件是等价的


查询特定位置的元素
db.as1.find({"name.1":"权威指南"})
db.as1.find({"name.0":"C#大全"})

$size
$size对于查询数组来说也是分的有用,他可以查询特定长度的数组
db.as1.find({name:{"$size":2}})


$slice
$slice操作符可以返回某个键匹配的数组元素的一个子集
{"_id" : ObjectId("572aba3d734e0336c344e8bf"),"name" : ["C#大全", "权威指南", "我的梦想"]}
db.as1.find({"_id" : ObjectId("572aba3d734e0336c344e8bf")},{name:{"$slice":2}})
find有两个参数第一个是用来匹配数据的,第二个是用来设置返回的数据的
name是一个数组 $slice返回这个数组中前2个元素
{"$slice":2} 前两个
    { "_id" : ObjectId("572aba3d734e0336c344e8bf"), "name" : [ "C#大全", "权威指南"] }
{"$slice":-2} 后两个
    { "_id" : ObjectId("572aba3d734e0336c344e8bf"), "name" : [ "权威指南", "我的梦想" ] }
{"$slice":[2,3]} 第2个之后的到第3个为止,如果没有第三个,则返回空
    { "_id" : ObjectId("572aba3d734e0336c344e8bf"), "name" : [ "我的梦想" ] }
{"$slice":[3,4]}
    { "_id" : ObjectId("572aba3d734e0336c344e8bf"), "name" : [ ] }

转载于:https://www.cnblogs.com/ansheng/p/5444137.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Spring Boot 使用 MongoDB 进行数组字段的查询,可以使用 $elemMatch 操作符。 例如,假设你有一个名为 "items" 的数组字段,要查询所有数组 "qty" 字段值大于 10 且 "name" 字段值等于 "abc" 的文档,可以这样写: ``` db.collection.find( { items: { $elemMatch: { qty: { $gt: 10 }, name: "abc" } } } ) ``` 另外还有 $in $nin $all等操作符供你使用, 可以根据实际的需求进行灵活的使用。 ### 回答2: 使用Spring Boot和MongoDB进行数组元素的匹配查询可以通过构建特定的查询对象来实现。 在Spring Boot,我们首先需要创建一个MongoTemplate Bean,用于执行MongoDB的查询操作。可以在Spring Boot应用的配置文件配置MongoDB数据库的连接信息,然后通过注入MongoTemplate Bean来使用它的功能。 接下来,我们可以使用MongoTemplate的find方法来执行查询操作。在查询条件,我们可以使用Query的Criteria对象来构建匹配条件。对于数组的元素匹配,我们可以使用in操作符。例如,如果我们要查询数组包含特定元素的文档,可以使用如下的代码: ``` Query query = new Query(Criteria.where("arrayField").in("value")); List<YourDocumentClass> documents = mongoTemplate.find(query, YourDocumentClass.class); ``` 在上面的示例,我们使用了Criteria的where方法指定了数组字段的名称,并使用in方法指定了要匹配的元素。然后,我们使用MongoTemplate的find方法执行查询,并指定要返回的文档类型。 需要注意的是,这个示例的"arrayField"和"value"分别是数组字段的名称和要匹配的元素值,需要根据实际情况进行替换。 除了使用in操作符之外,MongoDB还支持其他的数组操作符,如$all、$elemMatch等,可以根据实际需求选用合适的操作符。 通过使用上述的方法,我们可以方便地在Spring Boot查询MongoDB数组的匹配数据。 ### 回答3: 使用Spring Boot框架可以很容易地对MongoDB数组进行查询和匹配。下面是一个简单的示例: 首先,需要在Spring Boot项目的pom.xml文件添加MongoDB的依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> ``` 创建一个实体类,表示MongoDB的文档: ```java @Document(collection = "my_collection") public class MyDocument { @Id private String id; private List<String> data; // 省略构造函数、Getter和Setter方法 } ``` 创建一个Repository类,用于定义MongoDB的查询方法: ```java @Repository public interface MyDocumentRepository extends MongoRepository<MyDocument, String> { List<MyDocument> findByData(String data); } ``` 在Service类,注入MyDocumentRepository,并调用查询方法: ```java @Service public class MyService { @Autowired private MyDocumentRepository repository; public List<MyDocument> findByData(String data) { return repository.findByData(data); } } ``` 最后,在Controller类调用Service的方法: ```java @RestController @RequestMapping("/documents") public class MyController { @Autowired private MyService service; @GetMapping("/findByData") public List<MyDocument> findByData(@RequestParam String data) { return service.findByData(data); } } ``` 这样,当我们访问`/documents/findByData?data=test`时,将返回所有`data`字段包含"test"的文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值