我有一个文档集合,每个文档都包含array.我想要的输出是按特定条件过滤的展开的数组元素.
我可以通过执行以下操作来实现此目的:
db.collection.aggregate([
{
$unwind: "$myArrayField"
},
{
$match: {
"myArrayField.myCriteriaField": "myValue"
}
}
])
但放松一切似乎是浪费,所以我就这么做了
db.collection.aggregate([
{
$match: {
"myArrayField.myCriteriaField": "myValue"
}
},
{
$unwind: "$myArrayField"
},
{
$match: {
"myArrayField.myCriteriaField": "myValue"
}
}
])
要筛选出可行的候选文档,请展开这些文档,然后再次筛选展开的元素,因为会有不匹配的元素.
或者,我可以这样做
db.collection.aggregate([
{
$project: {
myArrayField: {
$filter: {
input: "$myArrayField",
as: "element",
cond: { $eq: ["$$element.myCriteriaField", "myValue"] }
}
}
}
},
{
$unwind: "$myArrayField"
}
])
甚至是
db.collection.aggregate([
{
$match: {
"myArrayField.myCriteriaField": "myValue"
}
},
{
$project: {
myArrayField: {
$filter: {
input: "$myArrayField",
as: "element",
cond: { $eq: ["$$element.myCriteriaField", "myValue"] }
}
}
}
},
{
$unwind: "$myArrayField"
}
])
哪一个是最有效率的?我不太了解聚合是如何运行的,不知道它可能依赖于哪些变量(集合大小、文档大小等).
最后,比赛取消比赛看起来很简单,但不得不这样做也感觉不对,所以我想知道我是不是错过了什么.