【发布时间】:2020-04-22 17:48:58
【问题描述】:
在下面的查询中,您可以看到状态数组中元素的顺序,这是我在文档中的实际顺序。
查询:
db.order_test.aggregate([]);
结果:
{
"_id" : ObjectId("5ea0805cb0b44d2784a70f90"),
"statuses" : [
{
"order" : 3,
"created_on" : ISODate("2019-11-25T18:44:48.930Z"),
"name" : "In Progress"
},
{
"order" : 2,
"created_on" : ISODate("2019-11-25T18:44:55.104Z"),
"name" : "Pending"
},
{
"order" : 2,
"created_on" : ISODate("2019-11-25T18:45:09.022Z"),
"name" : "Sent"
},
{
"order" : 1,
"created_on" : ISODate("2019-11-25T20:04:49.347Z"),
"name" : "Initial Viewed"
},
{
"order" : 6,
"created_on" : ISODate("2019-11-25T20:04:49.347Z"),
"name" : "Viewed"
},
{
"order" : 4,
"created_on" : ISODate("2019-11-25T20:04:49.347Z"),
"name" : "Opened"
},
{
"order" : 2,
"created_on" : ISODate("2019-12-15T05:59:04.719Z"),
"name" : "Abandoned"
}
]
}
现在在应用 $setUnion 之后
查询:
db.order_test.aggregate([
{
$addFields: {
statuses: {$setUnion: ['$statuses']}
}
}
]);
结果:
{
"_id" : ObjectId("5ea0805cb0b44d2784a70f90"),
"statuses" : [
{
"order" : 1,
"created_on" : ISODate("2019-11-25T20:04:49.347Z"),
"name" : "Initial Viewed"
},
{
"order" : 2,
"created_on" : ISODate("2019-11-25T18:44:55.104Z"),
"name" : "Pending"
},
{
"order" : 2,
"created_on" : ISODate("2019-11-25T18:45:09.022Z"),
"name" : "Sent"
},
{
"order" : 2,
"created_on" : ISODate("2019-12-15T05:59:04.719Z"),
"name" : "Abandoned"
},
{
"order" : 3,
"created_on" : ISODate("2019-11-25T18:44:48.930Z"),
"name" : "In Progress"
},
{
"order" : 4,
"created_on" : ISODate("2019-11-25T20:04:49.347Z"),
"name" : "Opened"
},
{
"order" : 6,
"created_on" : ISODate("2019-11-25T20:04:49.347Z"),
"name" : "Viewed"
}
]
}
可以清楚地看到,$setUnion 是按元素中的第一个属性“order”排序,然后按第二个属性“created_on”排序,然后它可能会按最后一个属性“name”排序状态数组中的每个元素。
此行为与文档 https://docs.mongodb.com/manual/reference/operator/aggregation/setUnion/ 中提到的内容相悖
这个命令对我很有用,我应该相信它吗?
我正在处理的场景:
"statuses" : [
{
"name" : "In Progress",
"created_on" : ISODate("2019-11-25T18:44:50.302Z")
},
{
"name" : "Pending",
"created_on" : ISODate("2019-11-25T18:44:55.104Z")
},
{
"name" : "Sent",
"created_on" : ISODate("2019-11-25T18:45:19.871Z")
},
{
"name" : "Initial Viewed",
"created_on" : ISODate("2019-11-25T20:08:42.299Z")
},
{
"name" : "Viewed",
"created_on" : ISODate("2019-11-25T20:10:04.016Z")
},
{
"name" : "Pending",
"created_on" : ISODate("2019-11-25T20:49:56.008Z")
},
{
"name" : "Sent",
"created_on" : ISODate("2019-11-26T02:30:17.701Z")
},
{
"name" : "Initial Viewed",
"created_on" : ISODate("2019-11-26T02:30:17.701Z")
},
{
"name" : "Viewed",
"created_on" : ISODate("2019-11-26T02:30:17.701Z")
},
{
"name" : "Opened",
"created_on" : ISODate("2019-11-26T02:30:17.701Z")
},
{
"name" : "Completed",
"created_on" : ISODate("2019-11-26T02:33:56.484Z")
}
],
我的集合中有超过 50k 的文档,具有上述给定的数组类型属性。问题是,我如何按名称重复状态,如您所见,Pending 出现了两次,Sent Initial Viewed 和 Viewed 相同。
要求的结果:
我必须更新 statuses 数组中所有具有重复状态名称的文档,以删除所有重复条目。首先出现的任何状态都应该保留,所有其他重复的状态都应该被删除。
有没有简单的方法通过 Mongo 本机更新查询(不是 javascript)来做到这一点?我的首要任务是如何匹配这些名称重复条目的记录?
【问题讨论】:
-
should I trust it?不,这就是为什么文档说它是unspecified
标签: mongodb mongodb-query aggregation-framework