我有这样的数据结构:
myStructure = {
1 : ['ab','bc','cd','gh'] ,
2 : ['bc','cd','de'] ,
3 : ['cd','de','ef12','xz','ygd']
}
我想找到“myStructure”里面所有数组中出现的元素:'cd'
我要在MongoDB中输入大量数据,我想找到类似上面例子的模式/重复...
有没有办法用MongoDB做到这一点?没有MongoDB,还有更好的方法吗?
更新1:
我注意到我的数据结构不是一个更好的...我不想仅限于像“1,2,3”这样的几个键,因此我将结构更改为:
myStructure = [
{key: 1, value: ['ab','bc','cd']} ,
{key: 2, value: ['bc','cd','de']} ,
{key: 3, value: ['cd','de','ef']},
...
]
到目前为止感谢您的答案,但如果您能根据新结构回答问题,我将感激不尽......谢谢......
答案 0 :(得分:1)
您需要的是使用$setIntersection
运算符进行聚合。
db.test.aggregate(
[
{ $project: { "commonElement": { $setIntersection: [ "$1", "$2", "$3" ]}}}
]
)
答案 1 :(得分:1)
如果您的意思是所有数组始终存在,那么您可以使用$setIntersection
和$redact
执行此操作:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$size": { "$setIntersection": ["$1","$2", "$3"] } },
0
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}},
{ "$project": {
"intersection": { "$setIntersection": ["$1","$2","$3"] }
}}
])
首先过滤任何不相交的东西然后显示交叉点。
所以同一文档中的所有数组都是:
{
"_id" : ObjectId("559a22f8369e4e157fe17338"),
"1" : [ "ab", "bc", "cd" ],
"2" : [ "bc", "cd", "de" ],
"3" : [ "cd", "de", "ef" ]
}
{
"_id" : ObjectId("559a2ebc369e4e157fe17339"),
"1" : [ "bc", "ab" ],
"2" : [ "de", "ef" ],
"3" : [ "aj", "kl" ]
}
你得到:
{
"_id" : ObjectId("559a22f8369e4e157fe17338"),
"intersection" : [ "cd" ]
}
使用以下单独的文件:
{ "key": 1, "value": ['ab','bc','cd']} ,
{ "key": 2, "value": ['bc','cd','de']},
{ "key": 3, "value": ['cd','de','ef']}
然后像这样处理:
db.collection.aggregate([
{ "$unwind": "$value" },
{ "$group": {
"_id": "$value",
"keys": { "$push": "$key" },
"count": { "$sum": 1 }
}},
{ "$match": { "count": { "$gt": 1 } } }
])
在单个文档中获取数组中的数组交集:
{
"id": 1,
"someKey": "abc",
"items": [
{ "key": 1, "value": ['ab','bc','cd']} ,
{ "key": 2, "value": ['bc','cd','de']},
{ "key": 3, "value": ['cd','de','ef']}
]
}
然后$unwind
多次并处理:
db.collection.aggregate([
{ "$unwind": "$items" },
{ "$unwind": "$items.value" },
{ "$group": {
"_id": {
"_id": "$_id",
"value": "$items.value"
},
"keys": { "$push": "$items.key" },
"count": { "$sum": 1 }
}},
{ "$match": { "count": { "$gt": 1 } } }
])