如何将 $expr mongo shell 查询转换为 mongoTemplate?

问题描述 投票:0回答:1

以下是我的收藏:

[
  {
    "_id": 1,
    "favorite": {
      "color": "red",
      "foods": {
        "fruits": "banana",
        "fastfood": [
          "burger",
          "sandwich"
        ]
      }
    }
  },
  {
    "_id": 2,
    "favorite": {
      "color": "green",
      "foods": {
        "noodles": "ramen",
        "fastfood": [
          "fries",
          "burger",
          "corn dog"
        ]
      }
    }
  },
  {
    "_id": 3,
    "favorite": {
      "color": "red",
      "foods": {
        "soup": "cream soup"
      }
    }
  }
]

我需要检查快餐项目是否相同。为了实现这一点,我已经有了 mongo shell 查询。

db.collection.find({
  $expr: {
    $eq: [
      [
        "burger",
        "sandwich"
      ],
      "$favorite.foods.fastfood"
    ]
  }
})

但是,我需要在 mongoTemplate 中使用它,因为我正在使用 Spring Boot 应用程序。我目前还做不到。

mongodb nosql mongotemplate
1个回答
0
投票

我认为

MongoTemplate
的翻译可能是这样的,你对 mongo 说“给我
favorite.foods.fastfood
["burger", "sandwich"]
的元素。

Query query = new Query(Criteria.where("favorite.foods.fastfood").is(List.of("burger", "sandwich")));
return mongoTemplate.find(query, YourDesiredDocument.class);

但是如果数组完全相同(包括元素顺序),它将返回数据。

因此,例如数组

["burger","sandwich"]
会很好地工作
但是
["sandwich","burger"]
不会返回任何数据

也许你不需要这个,但它可以提供帮助,你也可以尝试这个查询,其中没有检查顺序,因此将返回具有这些元素的所有数组。

使用

MongoTemplate
它可以是这样的(未测试):

Query query = new Query(new Criteria().andOperator(
            Criteria.where("favorite.foods.fastfood").all("burger", "sandwich"),
            Criteria.where("favorite.foods.fastfood").size(2)
        ));
return mongoTemplate.find(query, YourDesiredDocument.class);
© www.soinside.com 2019 - 2024. All rights reserved.