Uploaded image for project: 'MongoDB Shell'
  1. MongoDB Shell
  2. MONGOSH-972

Behavior of materialized views does not match legacy shell

    • Type: Icon: Bug Bug
    • Resolution: Fixed
    • Priority: Icon: Major - P3 Major - P3
    • 1.0.6
    • Affects Version/s: None
    • Component/s: Shell API
    • None
    • Not Needed
    • Iteration Kampala

      Problem Statement/Rationale

      What is going wrong?

      The examples on the Materialized Views docs page, when run in mongosh, do not match the behavior of the legacy shell, which leads to the documentation being incorrect / misleading.

      Steps to Reproduce

      How could an engineer replicate the issue you’re reporting?

      Run the following commands in the shell in order:

      db.bakesales.insertMany( [
         { date: new ISODate("2018-12-01"), item: "Cake - Chocolate", quantity: 2, amount: new NumberDecimal("60") },
         { date: new ISODate("2018-12-02"), item: "Cake - Peanut Butter", quantity: 5, amount: new NumberDecimal("90") },
         { date: new ISODate("2018-12-02"), item: "Cake - Red Velvet", quantity: 10, amount: new NumberDecimal("200") },
         { date: new ISODate("2018-12-04"), item: "Cookies - Chocolate Chip", quantity: 20, amount: new NumberDecimal("80") },
         { date: new ISODate("2018-12-04"), item: "Cake - Peanut Butter", quantity: 1, amount: new NumberDecimal("16") },
         { date: new ISODate("2018-12-05"), item: "Pie - Key Lime", quantity: 3, amount: new NumberDecimal("60") },
         { date: new ISODate("2019-01-25"), item: "Cake - Chocolate", quantity: 2, amount: new NumberDecimal("60") },
         { date: new ISODate("2019-01-25"), item: "Cake - Peanut Butter", quantity: 1, amount: new NumberDecimal("16") },
         { date: new ISODate("2019-01-26"), item: "Cake - Red Velvet", quantity: 5, amount: new NumberDecimal("100") },
         { date: new ISODate("2019-01-26"), item: "Cookies - Chocolate Chip", quantity: 12, amount: new NumberDecimal("48") },
         { date: new ISODate("2019-01-26"), item: "Cake - Carrot", quantity: 2, amount: new NumberDecimal("36") },
         { date: new ISODate("2019-01-26"), item: "Cake - Red Velvet", quantity: 5, amount: new NumberDecimal("100") },
         { date: new ISODate("2019-01-27"), item: "Pie - Chocolate Cream", quantity: 1, amount: new NumberDecimal("20") },
         { date: new ISODate("2019-01-27"), item: "Cake - Peanut Butter", quantity: 5, amount: new NumberDecimal("80") },
         { date: new ISODate("2019-01-27"), item: "Tarts - Apple", quantity: 3, amount: new NumberDecimal("12") },
         { date: new ISODate("2019-01-27"), item: "Cookies - Chocolate Chip", quantity: 12, amount: new NumberDecimal("48") },
         { date: new ISODate("2019-01-27"), item: "Cake - Carrot", quantity: 5, amount: new NumberDecimal("36") },
         { date: new ISODate("2019-01-27"), item: "Cake - Red Velvet", quantity: 5, amount: new NumberDecimal("100") },
         { date: new ISODate("2019-01-28"), item: "Cookies - Chocolate Chip", quantity: 20, amount: new NumberDecimal("80") },
         { date: new ISODate("2019-01-28"), item: "Pie - Key Lime", quantity: 3, amount: new NumberDecimal("60") },
         { date: new ISODate("2019-01-28"), item: "Cake - Red Velvet", quantity: 5, amount: new NumberDecimal("100") },
      ] );
      
      updateMonthlySales = function(startDate) {
         db.bakesales.aggregate( [
            { $match: { date: { $gte: startDate } } },
            { $group: { _id: { $dateToString: { format: "%Y-%m", date: "$date" } }, sales_quantity: { $sum: "$quantity"}, sales_amount: { $sum: "$amount" } } },
            { $merge: { into: "monthlybakesales", whenMatched: "replace" } }
         ] );
      };
      
      updateMonthlySales(new ISODate("1970-01-01"));
      
      show collections
      

      Expected Results

      What do you expect to happen?

      The show collections command returns the monthlybakesales collection.

      Actual Results

      What do you observe is happening?

      The show collections command does not return the monthlybakesales collection, even though it should have been created as part of the aggregation.

      Additional Notes

      Any additional information that may be useful to include.

      In the legacy shell, when running the same commands, the monthlybakesales is returned as expected.

      When I append .next() to the aggregation, the operation performs as expected. As in, when the function is:

      updateMonthlySales = function(startDate) {
         db.bakesales.aggregate( [
            { $match: { date: { $gte: startDate } } },
            { $group: { _id: { $dateToString: { format: "%Y-%m", date: "$date" } }, sales_quantity: { $sum: "$quantity"}, sales_amount: { $sum: "$amount" } } },
            { $merge: { into: "monthlybakesales", whenMatched: "replace" } }
         ] ).next();
      };
      

            Assignee:
            anna.henningsen@mongodb.com Anna Henningsen
            Reporter:
            jeffrey.allen@mongodb.com Jeffrey Allen
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: