Javascript 查找与顺序不一致的嵌套数组的精确匹配';没关系
假设这些数据:Javascript 查找与顺序不一致的嵌套数组的精确匹配';没关系,javascript,arrays,node.js,mongodb,mongodb-query,Javascript,Arrays,Node.js,Mongodb,Mongodb Query,假设这些数据: { "_id" : ObjectId("594d43d1da7887921c701575"), "hashSets" : [ { "data1" : [ "2bf2cededea424f47d64d33c511dd431", "40499da7ee1456a2f79dc39a718aaf9b" ], "dat
{
"_id" : ObjectId("594d43d1da7887921c701575"),
"hashSets" : [
{
"data1" : [
"2bf2cededea424f47d64d33c511dd431",
"40499da7ee1456a2f79dc39a718aaf9b"
],
"data2" : [
"b068931cc450442b63f5b3d276ea4297",
"16ebd6af0cadece819da7468a9fd79f4",
"8717cfca734e8987971f63b20eeb8024"
]
},
{
"data1" : [
"098F6BCD4621D373CADE4E832627B4F6",
"5A105E8B9D40E1329780D62EA2265D8A",
"AD0234829205B9033196BA818F7A872B"
],
"data2" : [
"8AD8757BAA8564DC136C1E07507F4A98"
]
}
],
"__v" : 0
}
我试图查询“hashset”上的精确匹配,但是“hashset”数组中的对象顺序可能不同,数据数组中的哈希顺序可能不同
我发现这篇文章有点类似:
虽然使用$size和$all有意义,但我不太确定如何将其应用于嵌套数组/对象
我使用了这个简单的查询,但看起来顺序应该是一样的:
db.analysis.find({hashSets:input.hashSets})
编辑:
为清楚起见:
input.hashSets = [
{
"data1" : [
"AD0234829205B9033196BA818F7A872B",
"098F6BCD4621D373CADE4E832627B4F6",
"5A105E8B9D40E1329780D62EA2265D8A"
],
"data2" : [
"8AD8757BAA8564DC136C1E07507F4A98"
]
},
{
"data1" : [
"40499da7ee1456a2f79dc39a718aaf9b",
"2bf2cededea424f47d64d33c511dd431"
],
"data2" : [
"b068931cc450442b63f5b3d276ea4297",
"8717cfca734e8987971f63b20eeb8024",
"16ebd6af0cadece819da7468a9fd79f4"
]
}
];
请注意,数据的内容是相同的,但不同数组中的数据顺序已更改。希望这更有意义。您似乎在谈论与合作的必要性 例如,如果我改变了样本的结构,以颠倒几个元素的顺序:
[
{
"data2" : [
"8AD8757BAA8564DC136C1E07507F4A98"
],
"data1" : [
"098F6BCD4621D373CADE4E832627B4F6",
"5A105E8B9D40E1329780D62EA2265D8A",
"AD0234829205B9033196BA818F7A872B"
]
},
{
"data2" : [
"b068931cc450442b63f5b3d276ea4297",
"16ebd6af0cadece819da7468a9fd79f4",
"8717cfca734e8987971f63b20eeb8024"
],
"data1" : [
"2bf2cededea424f47d64d33c511dd431",
"40499da7ee1456a2f79dc39a718aaf9b"
]
}
]
然后,我可以在条件内部应用该方法来匹配数组的元素,两者的顺序与“键”的顺序相反:
db.hashsets.find({
"hashSets": {
"$all": input.hashSets.map( e => ({ "$elemMatch": e }) )
}
})
这将产生一个“查询”,如:
如果您需要进一步了解实际的“关键点”,请更改映射或输入:
db.hashsets.find({
"hashSets": {
"$all": input.hashSets.map( e =>
({ "$elemMatch": { "data2": { "$all": e.data2 }, "data1": { "$all": e.data1 } }}) )
}
})
要生成类似以下内容的查询:
{
"hashSets": { "$all":
[
{
"$elemMatch" : {
"data2" : { "$all": [
"8AD8757BAA8564DC136C1E07507F4A98"
]},
"data1" : { "$all": [
"098F6BCD4621D373CADE4E832627B4F6",
"5A105E8B9D40E1329780D62EA2265D8A",
"AD0234829205B9033196BA818F7A872B"
]}
}
},
{
"$elemMatch" : {
"data2" : { "$all": [
"b068931cc450442b63f5b3d276ea4297",
"16ebd6af0cadece819da7468a9fd79f4",
"8717cfca734e8987971f63b20eeb8024"
]},
"data1" : { "$all": [
"2bf2cededea424f47d64d33c511dd431",
"40499da7ee1456a2f79dc39a718aaf9b"
]}
}
}
]
}
}
或最灵活,包括尺寸:
db.hashsets.find({
"hashSets": {
"$all": input.hashSets.map( e => {
var obj = {};
Object.keys(e).forEach(k => {
obj[k] = { "$all": e[k], "$size": e[k].length }
});
return { "$elemMatch": obj };
}),
"$size": input.hashSets.length
}
})
当然,“full”的意思是:
什么是
input.hashset
?您尝试的一个查询示例可能很方便,它可能是我的错,但我无法真正理解您在查找输入。哈希集与上面的数据相同,只是任何数组的顺序可能不同。仍然不清楚您在这里的意思。它是否与上面的“hasSets”完全相同,尽管顺序可能相反?或者是您希望匹配的“data1”
和“data2”
中“键”的值。如果您只是简单地显示一个示例输入的内容,可能会更加清晰。hashset
变量我会问,因为如果它是相同的结构,我会颠倒元素的顺序并将其传递给$all
,那么文档将按预期返回。所以我认为你需要用一些目前不适合你的东西来澄清你的情况。用更多的信息编辑了这篇文章。请看上面的答案,包括尺寸是我一直在寻找的。似乎有用!谢谢你的帮助!
db.hashsets.find({
"hashSets": {
"$all": input.hashSets.map( e => {
var obj = {};
Object.keys(e).forEach(k => {
obj[k] = { "$all": e[k], "$size": e[k].length }
});
return { "$elemMatch": obj };
}),
"$size": input.hashSets.length
}
})
{
"hashSets" : {
"$all" : [
{
"$elemMatch" : {
"data2" : {
"$all" : [
"8AD8757BAA8564DC136C1E07507F4A98"
],
"$size" : 1
},
"data1" : {
"$all" : [
"098F6BCD4621D373CADE4E832627B4F6",
"5A105E8B9D40E1329780D62EA2265D8A",
"AD0234829205B9033196BA818F7A872B"
],
"$size" : 3
}
}
},
{
"$elemMatch" : {
"data2" : {
"$all" : [
"b068931cc450442b63f5b3d276ea4297",
"16ebd6af0cadece819da7468a9fd79f4",
"8717cfca734e8987971f63b20eeb8024"
],
"$size" : 3
},
"data1" : {
"$all" : [
"2bf2cededea424f47d64d33c511dd431",
"40499da7ee1456a2f79dc39a718aaf9b"
],
"$size" : 2
}
}
}
],
"$size" : 2
}
}