我需要将两个嵌套数组与mongo进行比较,但我并不是真正的专家,因此我需要一些帮助。
假设我有一个包含数组slots
的文档:
[
[
{
"start": 1,
"end": 2
}
],
[
{
"start": 3,
"end": 4
},
{
"start": 5,
"end": 6
}
]
]
我需要知道另一个数组是否是它的子集:
db.collection.aggregate([
{
$project: {
slots: {
$setIsSubset: [
[
[
{
start: 1,
end: 2
}
],
[
{
start: 3,
end: 4
},
{
start: 5,
end: 6
}
]
],
"$slots"
]
}
}
}
])
这将返回true,但是如果我删除第二个子数组中的一个元素,由于子数组不再相等,它将返回false。
我考虑做某种$map
来比较每个子数组,但是我意识到我不知道如何引用我们要比较的数组的索引。
有什么想法吗?谢谢
编辑:存储数组的第一级以及我们要与之进行比较的数组是一周中的几天,因此需要保留信息。
答案 0 :(得分:2)
如果您将这些嵌套数组视为一周中的几天,则可能需要每天进行比较,并检查所有“对”是否都是子集。为此,您可以使用$addFields将输入添加为另一个字段,然后在下一步中根据$setIsSubset运算符生成的索引每天运行$range。如果所有元素都为真($allElementsTrue),则意味着您每天指定一个子集:
var input = [
[
{
start: 1,
end: 2
}
],
[
{
start: 5,
end: 6
}
]
];
db.col.aggregate([
{
$addFields: {
inputArray: input
}
},
{
$project: {
isSubset: {
$allElementsTrue: {
$map: {
input: { $range: [ 0, { $size: "$slots" } ] },
as: "index",
in: {
$setIsSubset: [
{ $arrayElemAt: [ "$inputArray", "$$index" ] },
{ $arrayElemAt: [ "$slots", "$$index" ] }
]
}
}
}
}
}
}
])