Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在MongoDB中查询字典数组中的数组?_Java_Mongodb_Spring Boot - Fatal编程技术网

Java 如何在MongoDB中查询字典数组中的数组?

Java 如何在MongoDB中查询字典数组中的数组?,java,mongodb,spring-boot,Java,Mongodb,Spring Boot,我有以下mongoDB文档结构- db.menus.findOne() { "_id" : ObjectId("5cf25412326c3f4f26df039b"), "restaurantId" : "301728", "items" : [ { "itemId&qu

我有以下mongoDB文档结构-

db.menus.findOne()
{
        "_id" : ObjectId("5cf25412326c3f4f26df039b"),
        "restaurantId" : "301728",
        "items" : [
                {
                    "itemId" : "CEBM4H41JR",
                    "name" : "Crun Chicken",
                    "imageUrl" : "",
                    "price" : 572,
                    "attributes" : [
                            "Tasty",
                            "Spicy"
                    ]
            },
            {
                    "itemId" : "53Q0XS3HPR",
                    "name" : "Devils Chicken",
                    "imageUrl" : "",
                    "price" : 595,
                    "attributes" : [
                            "Gravy",
                            "Salty"
                    ]
            }
        ]
}
{
    "_id" : ObjectId("5cf2540e326c3f4f26de93dd"),
    "restaurantId" : "301728",
    "name" : "Desire Foods",
    "imageUrl" : "https://b.zmtcdn.com/data/pictures/8/301728/d690ccb500d746530f56e1d637949da2_featured_v2.jpg",
    "latitude" : 28.4900591,
    "longitude" : 77.3066401,
    "attributes" : [
            "Chinese",
            " Fast Food",
            " Bakery"
    ],
    "opensAt" : "09:30",
    "closesAt" : "22:30"
}
我试图编写一个查询,根据文档中“items”下的“attributes”字段获取所有菜单

如果给出了“项目”的“名称”,并且我得到了一个结果,那么我已经做了以下操作来获取菜单-

db.menus.find({ 'items' : {$elemMatch : {'name' : {$regex : "Chicken Thali", $options: 'i' }}}}).pretty()
我已经尝试了这个方法来获得属性的结果,但它不起作用-

db.menus.find({'items' : {$elemMatch : {'attributes' : {$all : [{$regex : "Tasty", $options: 'i' }]}}}})
如何获取该列表?我还想在spring引导应用程序中为mongoRepository编写此查询

此外,根据获得的restaurantId,我必须查询餐馆集合,以便找到餐馆集合中具有以下结构的所有餐馆-

db.menus.findOne()
{
        "_id" : ObjectId("5cf25412326c3f4f26df039b"),
        "restaurantId" : "301728",
        "items" : [
                {
                    "itemId" : "CEBM4H41JR",
                    "name" : "Crun Chicken",
                    "imageUrl" : "",
                    "price" : 572,
                    "attributes" : [
                            "Tasty",
                            "Spicy"
                    ]
            },
            {
                    "itemId" : "53Q0XS3HPR",
                    "name" : "Devils Chicken",
                    "imageUrl" : "",
                    "price" : 595,
                    "attributes" : [
                            "Gravy",
                            "Salty"
                    ]
            }
        ]
}
{
    "_id" : ObjectId("5cf2540e326c3f4f26de93dd"),
    "restaurantId" : "301728",
    "name" : "Desire Foods",
    "imageUrl" : "https://b.zmtcdn.com/data/pictures/8/301728/d690ccb500d746530f56e1d637949da2_featured_v2.jpg",
    "latitude" : 28.4900591,
    "longitude" : 77.3066401,
    "attributes" : [
            "Chinese",
            " Fast Food",
            " Bakery"
    ],
    "opensAt" : "09:30",
    "closesAt" : "22:30"
}

整个操作可以在一个查询中完成吗?

我认为您可以修改查询以使用$in而不是$all。 为了达到预期效果,您可以尝试:

  db.collection.aggregate([
  {
    "$match": {
      "items": {
        "$elemMatch": {
          "attributes": {
            "$in": [
              "Tasty"
            ]
          }
        }
      }
    }
  },
  {
    "$lookup": {
      "from": "restaurant",
      "localField": "restaurantId",
      "foreignField": "restaurantId",
      "as": "restaurants"
    }
  },
  {
      "$unwind": "restaurants"
  },
  {
      "$replaceRoot": { "newRoot": "$restaurants" }
  }
])
根据需要在适当的阶段使用$match来限制在内存中提取的文档