在MongoDB Collection

时间:2015-07-06 06:38:35

标签: mongodb duplicates aggregation-framework

我有这样的数据结构:

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']},
        ...
    ]

到目前为止感谢您的答案,但如果您能根据新结构回答问题,我将感激不尽......谢谢......

2 个答案:

答案 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 } } }
])