$elemMatch在spring数据mongodb中的等效项

vwkv1x7d  于 2022-12-03  发布在  Go
关注(0)|答案(5)|浏览(139)

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

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

8ftvxx2r1#

我可以得到答案。这可以在Spring data 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"))));
inn6fuwd

inn6fuwd2#

我想在你的答案中查询生成下面的查询

{ "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));
sulc1iza

sulc1iza3#

刚刚使用$elemMatch和spring数据标准API实现了$all

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

**注意:**重要部分是为每个Criteria.elemMatch(...)元素调用Criteria.all(...)内的getCriteriaObject方法。

woobm2wo

woobm2wo4#

只是为了让@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))));
ldfqzlk8

ldfqzlk85#

Hi i也在Kotlin中实现了,它是关于if语句的扩展,用于创建动态查询:)
第一个

相关问题