在MongoDb中使用addToSet时将订单作为原始文档进行维护
我阅读了文档,发现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:
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
结果
by$group
和get firstResults.k
,get firstName
,构建计数器
结果数组。v.TCR
按null并获取最小$group
,构造时间
的唯一数组,在键值对中构造否
数组,结果
迭代$reduce
循环并删除重复文档TCR
若要显示必填字段,请使用$project
将$arrayToObject
数组转换为对象,将无数组转换为字符串,并使用“-”进行concat结果
否..仍然不起作用,,,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"
]
}
}
}
}
}
}
])