我需要知道spring data mongo db中的等效代码到下面的代码: -
db.inventory.find( {
qty: { $all: [
{ "$elemMatch" : { size: "M", num: { $gt: 50} } },
{ "$elemMatch" : { num : 100, color: "green" } }
] }
} )
答案 0 :(得分:17)
我能得到答案。这可以使用以下代码在Spring数据mongodb中完成
Query query = new Query();
query.addCriteria(Criteria.where("qty").elemMatch(Criteria.where("size").is("M").and("num").gt(50).elemMatch(Criteria.where("num").is(100).and("color").is("green"))));
答案 1 :(得分:1)
我认为查询在查询下面生成的答案
{ "qty" : { "$elemMatch" : { "num" : 100 , "color" : "green"}}}
我想那不是你需要的。
它唯一检查最后的elemMatch表达式并非全部。
试试这个。
query = new Query();
Criteria first = Criteria.where("qty").elemMatch(Criteria.where("size").is("M").and("num").gt(50));
Criteria two = Criteria.where("qty").elemMatch(Criteria.where("num").is(100).and("color").is("green"));
query.addCriteria(new Criteria().andOperator(first, two));
答案 2 :(得分:1)
只需使用弹簧数据Criteria API和$all
来实现$elemMatch
:
var elemMatch1 = new Criteria()
.elemMatch(Criteria.where("size").is("M").and("num").gt(50));
var elemMatch2 = new Criteria()
.elemMatch(Criteria.where("num").is(100).and("color").is("green"));
var criteria = Criteria.where("qty")
.all(elemMatch1.getCriteriaObject(), elemMatch2.getCriteriaObject());
mongoTemplate.find(Query.query(criteria), Inventory.class);
注意:重要的部分是在getCriteriaObject
中为每个Criteria.all(...)
元素调用Criteria.elemMatch(...)
方法。
答案 3 :(得分:1)
只是为了让@Vaibhav 的回答更清楚一点。
数据库中的给定文档
{
"modified": true,
"items": [
{
"modified": true,
"created": false
},
{
"modified": false,
"created": false
},
{
"modified": true,
"created": true
}
]
}
如果您需要一个项目的两个属性都为真的项目,您可以执行以下查询。
Query query = new Query();
query.addCriteria(Criteria.where("modified").is(true));
query.addCriteria(Criteria.where("items")
.elemMatch(Criteria.where("modified").is(true)
.and("created").is(true)));
这里是如何在 elemMatch 中使用 OR 进行查询的示例
Query query = new Query();
query.addCriteria(Criteria.where("modified").is(true));
query.addCriteria(Criteria.where("items")
.elemMatch(new Criteria().orOperator(
Criteria.where("modified").is(true),
Criteria.where("created").is(true))));