java mongo 查询数组,MongoDB高级查询 - 根据对象数组获取数据

要做一些标准操作员不能立即提供的更详细的条件,那么最好的方法是使用聚合框架 . 这允许您进行一些处理以处理我们的条件,例如匹配的数量:

db.collection.aggregate([

// Filter the documents that are possible matches

{ "$match": {

"orgRoles": {

"$elemMatch": {

"app": "ANGRYBIRDS", "orgId": "CODOE"

}

}

}},

// De-normalize the array content

{ "$unwind": "$orgRoles" },

// Group and count the matches

{ "$group": {

"_id": "$_id",

"orgRoles": { "$push": "$orgRoles" },

"matched": {

"$sum": {

"$cond": [

{ "$eq": ["$orgRoles.app", "ANGRYBIRDS"] },

1,

0

]

}

}

}},

// Filter where matched is more that 1

{ "$match": {

"orgRoles": {

"$elemMatch": {

"app": "ANGRYBIRDS", "orgId": "CODOE"

}

},

"matched": 1

}},

// Optionally project to just keep the original fields

{ "$project": { "orgRoles": 1 } }

])

这里的主要事情发生在处理初始$match之后,只返回那些至少有一个数组元素与主条件匹配的文档,然后用$unwind处理数组元素后,可以单独检查它们 .

诀窍是使用$cond运算符的条件$sum操作,它是"ternary" . 这会在数组中找到"howMany"匹配到"ANGRYBIRDS"字符串 . 在此之后,您再次 $match 以便"filter"任何匹配计数超过一个的文档 . 仍然留在那里的其他条件,但这是没有必要的 .

只是为了记录,这也可以使用$where子句的JavaScript评估,但由于它可能在处理时效率不高:

db.collection.find({

"orgRoles": {

"$elemMatch": {

"app": "ANGRYBIRDS", "orgId": "CODOE"

}

},

"$where": function() {

var orgs = this.orgRoles.filter(function(el) {

return el.app == "ANGRYBIRDS";

});

return ( orgs.length == 1 );

}

})

  • 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、付费专栏及课程。

余额充值