Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
在MongoDb中使用addToSet时将订单作为原始文档进行维护_Mongodb_Mongoose_Mongodb Query_Aggregation Framework - Fatal编程技术网

在MongoDb中使用addToSet时将订单作为原始文档进行维护

在MongoDb中使用addToSet时将订单作为原始文档进行维护,mongodb,mongoose,mongodb-query,aggregation-framework,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,我阅读了文档,发现addToSet不能保证订单。 但是我有没有办法把订单保留为原始文件。 我的问题是:- aggregate([{$match: { $or:[{"Name.No":"119"},{"Name.No":"120"}] }}, {$project: { x:{$objectToArray:"$Results"} }},{$unwind:

我阅读了文档,发现addToSet不能保证订单。 但是我有没有办法把订单保留为原始文件。 我的问题是:-

    aggregate([{$match: {
      $or:[{"Name.No":"119"},{"Name.No":"120"}]
    }}, {$project: {
      x:{$objectToArray:"$Results"}
    }},{$unwind: "$x"},{$group: {_id: "$x.k", distinctVals: {$addToSet: "$x.v.TCR"}}}])
样本数据:

{"Name" : {"No." : "119","Time" : "t"},
"Results":{"K1" : {"Counters" : x, "TCR" : [{"Name" : "K11", "Result" : "PASSED"}, 
                                             {"Name" : "K12","Result" : "FAILED"},
                                             {"Name" : "K13","Result" : "PASSED"}]
                    },
            "K2" : {"Counters": y, "TCR" : [{"Name" : "K21","Result" : "PASSED"},              
                                            {"Name" : "K22","Result" : "PASSED"}]
                      
                    }
            
           }
}
} 工作2

} 预期的

 {"Name" : {"No." : "119-120","Time" : "lowest(t,t1)"},
"Results":{"K1" : {"Counters" : x, "TCR" : [{"Name" : "K11", "Result" : "PASSED"}, 
                                             {"Name" : "K12","Result" : "PASSED"},
                                             {"Name" : "K13","Result" : "PASSED"}]
                    },
            "K2" : {"Counters": y, "TCR" : [{"Name" : "K21","Result" : "PASSED"},              
                                            {"Name" : "K22","Result" : "PASSED"}]
                      
                    },
             "K3" : {"Counters": y, "TCR" : [{"Name" : "K31","Result" : "PASSED"},              
                                            {"Name" : "K32","Result" : "PASSED"}]
                      
                    }
            
           
}
} 我希望保持与原始文档相同的顺序,并且每次文档都会更改,因此我无法根据任何参数进行排序。

  • 使用
    $objectToArray
  • $unwind
    解构
    结果
    数组
  • $unwind
    解构
    结果.v.TCR
    数组
  • $match
    以筛选通过的
    结果
  • $group
    by
    Results.k
    和get first
    Name
    ,get first
    计数器
    ,构建
    结果数组。v.TCR
  • $group
    按null并获取最小
    时间
    ,构造
    的唯一数组,在键值对中构造
    结果
    数组,
    $reduce
    迭代
    TCR
    循环并删除重复文档
  • $project
    若要显示必填字段,请使用
    $arrayToObject
    结果
    数组转换为对象,将无数组转换为字符串,并使用“-”进行concat

“No.”字段中的“.”(点)无效,这可能会导致mongodb查询操作中出现问题,我建议不要使用“.”(点)作为字段名


否..仍然不起作用,,,push也没有保留顺序。您可以在问题中发布示例文档和预期结果吗。使用示例数据更新的问题根据您的查询,您的文档无效,您确定
结果
已经是数组吗?因为您已使用
x:{$objectToArray:$Results}将其从对象转换为数组
因此不需要$project stage。您现在可以检查一下吗?您可以在查询中添加一个示例数据吗?您如何定义订单?假设您输入的是
[20,10,20]
。您希望获得什么输出<代码>[10,20]
[20,10]
?@turivishal的解决方案提供了
[20,10]
添加的样本数据。
 {"Name" : {"No." : "119-120","Time" : "lowest(t,t1)"},
"Results":{"K1" : {"Counters" : x, "TCR" : [{"Name" : "K11", "Result" : "PASSED"}, 
                                             {"Name" : "K12","Result" : "PASSED"},
                                             {"Name" : "K13","Result" : "PASSED"}]
                    },
            "K2" : {"Counters": y, "TCR" : [{"Name" : "K21","Result" : "PASSED"},              
                                            {"Name" : "K22","Result" : "PASSED"}]
                      
                    },
             "K3" : {"Counters": y, "TCR" : [{"Name" : "K31","Result" : "PASSED"},              
                                            {"Name" : "K32","Result" : "PASSED"}]
                      
                    }
            
           
}
db.collection.aggregate([
  { $addFields: { Results: { $objectToArray: "$Results" } } },
  { $unwind: "$Results" },
  { $unwind: "$Results.v.TCR" },
  { $match: { "Results.v.TCR.Result": "PASSED" } },
  {
    $group: {
      _id: "$Results.k",
      Name: { $first: "$Name" },
      Counters: { $first: "$Results.v.Counters" },
      TCR: { $push: "$Results.v.TCR" }
    }
  },
  {
    $group: {
      _id: null,
      Time: { $min: "$Name.Time" },
      No: { $addToSet: "$Name.No" },
      Results: {
        $push: {
          k: "$_id",
          v: {
            Counters: "$Counters",
            TCR: {
              $reduce: {
                input: "$TCR",
                initialValue: [],
                in: {
                  $cond: [
                    {
                      $in: [
                        {
                          Name: "$$this.Name",
                          Result: "$$this.Result"
                        },
                        "$$value"
                      ]
                    },
                    "$$value",
                    {
                      $concatArrays: [
                        "$$value",
                        [
                          {
                            Name: "$$this.Name",
                            Result: "$$this.Result"
                          }
                        ]
                      ]
                    }
                  ]
                }
              }
            }
          }
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      Results: { $arrayToObject: "$Results" },
      Name: {
        Time: "$Time",
        No: {
          $reduce: {
            input: "$No",
            initialValue: "",
            in: {
              $concat: [
                "$$value",
                { $cond: [{ $eq: ["$$value", ""]}, "", "-"] },
                "$$this"
              ]
            }
          }
        }
      }
    }
  }
])