Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.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 3.2中优化管道查询_Java_Mongodb_Spring Data Mongodb - Fatal编程技术网

Java 在mongodb 3.2中优化管道查询

Java 在mongodb 3.2中优化管道查询,java,mongodb,spring-data-mongodb,Java,Mongodb,Spring Data Mongodb,下面我有一个mongodb 3.2的mongodb数据示例,希望优化管道: {"_id": {"$oid":"5808578b33fa6f161c9747f8"},"_class":"exceltest.TestBean","bookName":"Test6","revenue":10.0,"unitsSold":1,"bookCategory":[{"categoryCode":"Cooking/"},{"categoryCode":"Cooking/Beverages"},{"categor

下面我有一个mongodb 3.2的mongodb数据示例,希望优化管道:

{"_id": {"$oid":"5808578b33fa6f161c9747f8"},"_class":"exceltest.TestBean","bookName":"Test6","revenue":10.0,"unitsSold":1,"bookCategory":[{"categoryCode":"Cooking/"},{"categoryCode":"Cooking/Beverages"},{"categoryCode":"Food Receipe/"},{"categoryCode":"Food Receipe/Bartending"},{"categoryCode":"Cooking/Beverages/Bartending"},{"categoryCode":"Food Receipe/Taste"}]}
{"_id":{"$oid":"5808578b33fa6f161c9747f9"},"_class":"exceltest.TestBean","bookName":"Test1","revenue":11.0,"unitsSold":2,"bookCategory":[{"categoryCode":"Cooking/"},{"categoryCode":"Cooking/Beverages"},{"categoryCode":"Food Receipe/"},{"categoryCode":"Food Receipe/Bartending"},{"categoryCode":"Cooking/Beverages/Bartending"},{"categoryCode":"Food Receipe/Taste"}]}
{"_id":{"$oid":"5808578b33fa6f161c9747fa"},"_class":"exceltest.TestBean","bookName":"Test2","revenue":12.0,"unitsSold":3,"bookCategory":[{"categoryCode":"Cooking/"},{"categoryCode":"Cooking/Beverages"},{"categoryCode":"Food Receipe/"},{"categoryCode":"Food Receipe/Bartending"},{"categoryCode":"Cooking/Beverages/Bartending"},{"categoryCode":"Food Receipe/Taste"}]}
{"_id":{"$oid":"5808578b33fa6f161c9747fb"},"_class":"exceltest.TestBean","bookName":"Test3","revenue":13.0,"unitsSold":4,"bookCategory":[{"categoryCode":"Cooking/"},{"categoryCode":"Cooking/Beverages"},{"categoryCode":"Food Receipe/"},{"categoryCode":"Food Receipe/Bartending"},{"categoryCode":"Cooking/Beverages/Bartending"},{"categoryCode":"Food Receipe/Taste"}]}
{"_id":{"$oid":"5808578b33fa6f161c9747fc"},"_class":"exceltest.TestBean","bookName":"Test4","revenue":14.0,"unitsSold":5,"bookCategory":[{"categoryCode":"Cooking/"},{"categoryCode":"Cooking/Beverages"},{"categoryCode":"Food Receipe/"},{"categoryCode":"Food Receipe/Bartending"},{"categoryCode":"Cooking/Beverages/Bartending"},{"categoryCode":"Food Receipe/Taste"}]}
{"_id":{"$oid":"5808578b33fa6f161c9747fd"},"_class":"exceltest.TestBean","bookName":"Test5","revenue":15.0,"unitsSold":6,"bookCategory":[{"categoryCode":"Cooking/"},{"categoryCode":"Cooking/Beverages"},{"categoryCode":"Food Receipe/"},{"categoryCode":"Food Receipe/Bartending"},{"categoryCode":"Cooking/Beverages/Bartending"},{"categoryCode":"Food Receipe/Taste"}]}
{"_id":{"$oid":"5808578b33fa6f161c9747fe"},"_class":"exceltest.TestBean","bookName":"Test10","revenue":16.0,"unitsSold":7,"bookCategory":[{"categoryCode":"Cooking/"},{"categoryCode":"Cooking/Beverages"},{"categoryCode":"Food Receipe/"},{"categoryCode":"Food Receipe/Bartending"},{"categoryCode":"Cooking/Beverages/Bartending"},{"categoryCode":"Food Receipe/Taste"}]}
{"_id":{"$oid":"5808578b33fa6f161c9747ff"},"_class":"exceltest.TestBean","bookName":"Test11","revenue":100.0,"unitsSold":100,"bookCategory":[{"categoryCode":"Cooking/"},{"categoryCode":"Cooking/Beverages"},{"categoryCode":"Food Receipe/"},{"categoryCode":"Food Receipe/Bartending"},{"categoryCode":"Cooking/Beverages/Bartending"},{"categoryCode":"Food Receipe/Taste"}]}
 {"_id":{"$oid":"580857b833fa6f0c3499e462"},"_class":"exceltest.TestBean","bookName":"Test1","revenue":20.0,"unitsSold":10,"bookCategory":[{"categoryCode":"Cooking/"},{"categoryCode":"Cooking/Beverages"},{"categoryCode":"Food Receipe/"},{"categoryCode":"Food Receipe/Bartending"}]}
 {"_id":{"$oid":"580857b833fa6f0c3499e463"},"_class":"exceltest.TestBean","bookName":"Test2","revenue":19.0,"unitsSold":9,"bookCategory":[{"categoryCode":"Cooking/"},{"categoryCode":"Cooking/Beverages"},{"categoryCode":"Food Receipe/"},{"categoryCode":"Food Receipe/Bartending"}]}
{"_id":{"$oid":"580857b833fa6f0c3499e464"},"_class":"exceltest.TestBean","bookName":"Test3","revenue":18.0,"unitsSold":8,"bookCategory":[{"categoryCode":"Cooking/"},{"categoryCode":"Cooking/Beverages"},{"categoryCode":"Food Receipe/"},{"categoryCode":"Food Receipe/Bartending"}]}
 {"_id":{"$oid":"580857b833fa6f0c3499e465"},"_class":"exceltest.TestBean","bookName":"Test4","revenue":17.0,"unitsSold":7,"bookCategory":[{"categoryCode":"Cooking/"},{"categoryCode":"Cooking/Beverages"},{"categoryCode":"Food Receipe/"},{"categoryCode":"Food Receipe/Bartending"}]}
{"_id":{"$oid":"580857b833fa6f0c3499e466"},"_class":"exceltest.TestBean","bookName":"Test5","revenue":16.0,"unitsSold":6,"bookCategory":[{"categoryCode":"Cooking/"},{"categoryCode":"Cooking/Beverages"},{"categoryCode":"Food Receipe/"},{"categoryCode":"Food Receipe/Bartending"}]}
 {"_id":{"$oid":"580857b833fa6f0c3499e467"},"_class":"exceltest.TestBean","bookName":"Test1","revenue":15.0,"unitsSold":5,"bookCategory":[{"categoryCode":"Cooking/"},{"categoryCode":"Cooking/Beverages"},{"categoryCode":"Food Receipe/"},{"categoryCode":"Food Receipe/Bartending"}]}
 {"_id":{"$oid":"580857b833fa6f0c3499e468"},"_class":"exceltest.TestBean","bookName":"Test2","revenue":14.0,"unitsSold":4,"bookCategory":[{"categoryCode":"Cooking/"},{"categoryCode":"Cooking/Beverages"},{"categoryCode":"Food Receipe/"},{"categoryCode":"Food Receipe/Bartending"}]}
 {"_id":{"$oid":"580857b833fa6f0c3499e469"},"_class":"exceltest.TestBean","bookName":"Test3","revenue":13.0,"unitsSold":3,"bookCategory":[{"categoryCode":"Cooking/"},{"categoryCode":"Cooking/Beverages"},{"categoryCode":"Food Receipe/"},{"categoryCode":"Food Receipe/Bartending"}]}
{"_id":{"$oid":"580857b833fa6f0c3499e46a"},"_class":"exceltest.TestBean","bookName":"Test4","revenue":12.0,"unitsSold":2,"bookCategory":[{"categoryCode":"Cooking/"},{"categoryCode":"Cooking/Beverages"},{"categoryCode":"Food Receipe/"},{"categoryCode":"Food Receipe/Bartending"}]}
{"_id":{"$oid":"580857b833fa6f0c3499e46b"},"_class":"exceltest.TestBean","bookName":"Test5","revenue":11.0,"unitsSold":1,"bookCategory":[{"categoryCode":"Cooking/"},{"categoryCode":"Cooking/Beverages"},{"categoryCode":"Food Receipe/"},{"categoryCode":"Food Receipe/Bartending"}]}
我有以下疑问:

 db.books.aggregate([
{$match:{'bookCategory.categoryCode' : 'Cooking/'}},
 {$unwind:'$bookCategory'}, 
/* This unwind creating performance problems, with 1M records, with 100 (Book Categories / book)  elements in subdocuments causes 100M documents to be retrieved, may cause memory problems for our memory size : 4GB */
 /*Pipeline 1 */
{ "$group": {
    "_id": {
        "categoryCode": "$bookCategory.categoryCode",
        "book": "$bookName"
    },
    "revenue": { $sum:"$revenue" },
     "unitsSold": { $sum:"$unitsSold" }
}
 }
,
{$match:{'_id.categoryCode' : {$regex : 'Cooking/'}}},
 /*Pipeline 2 */
{ "$group": {
    "_id": "$_id.categoryCode",


    "books": {
        "$push": {
          //  "category": "$_id.categoryCode",
    "book":"$_id.book",
    "revenue": { $sum:"$revenue" },
     "unitsSold": { $sum:"$unitsSold" }
        },
    },
    "topRevenue": { $sum: "$revenue" },
    "topUnitsSold": { $sum:"$unitsSold" }
}},
{ "$sort": { "topRevenue": -1 } },
{ "$limit": 3},

{ "$project": {
    "books": { "$slice": [ "$books", 3 ] },
    "topRevenue": 1,
    "topUnitsSold": 1
}}

])
执行管道1时,它生成48个文档,输出如下:

/*一,*/

{
"_id" : {
    "categoryCode" : "Food Receipe/Taste",
    "book" : "Test1"
},
"revenue" : 11,
"unitsSold" : 2
}

}

}

} 等等

我只想在管道1阶段解决这个问题。请让我知道mongodb 3.2是否可行。请告诉我是否可以使用spring data mongodb

请帮忙

问候


Kris

你在第一阶段进行匹配,保持在那里,然后我建议你通过管道输入尽可能少的数据,因此在匹配后添加一个项目

  • 只包括您需要的字段
  • 仅包括相关的数组项,因此展开生成的“较小”文档
  • 这是你可以使用的第二种方法。这有点像:

    $project: {
             bookCategory: {
                $filter: {
                   input: "$bookCategory",
                   as: "bookCat",
                   cond: { $eq: [ "$$bookCat.categoryCode", "Cooking/"] }
                }
             }
          }
    
    这将减少文档数量,并使聚合更具性能

    您甚至可以消除第一个匹配,因为投影消除了未加工$eq语句的数组项

    只需尝试一些组合,看看在您的场景中什么是有效的(并且是最有效的)

    更新: 我创建了一个小聚合,使用一个数组过滤器来限制数组中的项目数(以及展开)。 这将按类别对书籍进行分组。我将book文档放在books数组中(供参考),但您可以将其限制为仅包含标题(数据越少,聚合速度越快)


    我建议您在代码中创建此聚合,以便根据您想要的值(食物/烹饪)构建阵列过滤器。

    感谢您的回答@HoefMeistert,请参阅我的数据有些书属于“烹饪/”、“烹饪/饮料/调酒师”、“烹饪/饮料”、“食物接收/”、“食物接收/调酒师”其他书籍则分为“烹饪/”、“烹饪/饮料/调酒师”、“烹饪/饮料”、“食品调酒师/”、“食品调酒师/调酒师”和“食品调酒师/调酒师/口味”等类别。当我试图在第一条管道中匹配w.r.t.“Cooking/”类别时,它检索烹饪和食品接收类别的记录。请help@chiku我看到了你的数据。最好先测试$redact,然后测试$match()“$redact+$match Sequence Optimization”。更重要的是,$regex可以被$substr-maybe()所取代?@chiku“Cooking/”上的匹配你想做什么。你总是在第一部分匹配吗?或者你也可以做一场关于“调酒师”的比赛?如果是这样,我建议您重新安排您的阶段。@Hoefmeister,我想计算属于所有比赛的所有书籍的收入和单位库存以及总收入,总单位库存,从“烹饪/饮料”类别开始,按书籍类别分组,“烹饪/饮料/调酒师”等。我匹配的查询是“烹饪/”类别,并通过管道连接到“烹饪/”类别的regex,我不想因为性能问题而解除,如果我们有100万个文档和100个烹饪类别,第一个管道将解除约100万个文档。希望你能理解它的严重性。请帮忙。kris@HoefMeistert,请在此问题上提供任何帮助。你好,克里斯
    /* 3 */
    {
    "_id" : {
        "categoryCode" : "Food Receipe/Taste",
        "book" : "Test2"
    },
    "revenue" : 12,
    "unitsSold" : 3
    
     /* 4 */
    {
    "_id" : {
        "categoryCode" : "Food Receipe/Taste",
        "book" : "Test6"
    },
    "revenue" : 10,
    "unitsSold" : 1
    
    $project: {
             bookCategory: {
                $filter: {
                   input: "$bookCategory",
                   as: "bookCat",
                   cond: { $eq: [ "$$bookCat.categoryCode", "Cooking/"] }
                }
             }
          }
    
    db.collection.aggregate(
    
      // Pipeline
      [
        // Stage 1
        {
          $project: {
            bookName : 1,
            revenue : 1,
            unitsSold : 1,
          bookCategory: {
                      $filter: {
                         input: "$bookCategory",
                         as: "bookCat",
                         cond: { $eq:[ 'Cooking', {$substr:["$$bookCat.categoryCode",0,7]}] }
                      }
                   }
          }
        },
    
        // Stage 2
        {
          $unwind: "$bookCategory"
        },
    
        // Stage 3
        {
          $group: {
             _id: {
                  categoryCode: "$bookCategory.categoryCode",
              },
              books : { $push: "$$ROOT" },
              revenue: { $sum:"$revenue" },
              unitsSold: { $sum:"$unitsSold" }
          }
        }
    
      ]
    );