$ elemMatch相当于spring数据mongodb

时间:2015-03-05 09:59:43

标签: mongodb spring-data-mongodb

我需要知道spring data mongo db中的等效代码到下面的代码: -

db.inventory.find( {
                     qty: { $all: [
                                    { "$elemMatch" : { size: "M", num: { $gt: 50} } },
                                    { "$elemMatch" : { num : 100, color: "green" } }
                                  ] }
                   } )

4 个答案:

答案 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))));