2016-01-30 59 views
1

我跟踪用户IP的将它们添加到用户的文档的数组,像这样:如何找到在一个数组匹配值的MongoDB记录

{ 
    "_id": "LafnHzmQL6rBmXNxJ", 
    "name": "someuser", 
    "displayName": "SomeUser", 
    "knownIPs": ["1.1.1.1", "2.2.2.2", "3.3.3.3"] 
} 

我如何才能找到任何文件,其中任何knownIPs的一个匹配任何knownIPs的另一个(没有指定具体的值),无论实际IP是什么。

目标是识别使用多个帐户的人员,以便他们可以以编程方式进行标记以供进一步检查。我有超过40,000个用户,这会对聚合过于密集吗?

+0

你到目前为止试过的命令是什么? – dikesh

+2

在https://docs.mongodb.org/master/reference/operator/query/in/ – styopdev

回答

2

使用下列聚合管道:

db.collection.aggregate([ 
    { "$unwind": "$knownIPs" }, 
    { 
     "$group": { 
      // Group by the IP address 
      "_id": "$knownIPs", 

      // Count number of matching docs for the group 
      "count": { "$sum": 1 }, 

      // Save the _id for matching docs 
      "docs": { "$push": "$_id" } 
     } 
    }, 
    { 
     "$match": { 
      "count": { "$gt": 1 } 
     } 
    } 
]) 
+1

中使用$谢谢,这完美无缺! – Vertical3

1

我认为你应该使用$ knownIPs的阵列上放松功能。这样它会从父对象给你三个子对象。

例如:

db.document_name.aggregate([ { $unwind : "$knownIPs" } ]) gives you 

{ 
    "_id": "LafnHzmQL6rBmXNxJ", 
    "name": "someuser", 
    "displayName": "SomeUser", 
    "knownIPs": "1.1.1.1" 
} 

{ 
    "_id": "LafnHzmQL6rBmXNxJ", 
    "name": "someuser", 
    "displayName": "SomeUser", 
    "knownIPs": "2.2.2.2" 
} 

{ 
    "_id": "LafnHzmQL6rBmXNxJ", 
    "name": "someuser", 
    "displayName": "SomeUser", 
    "knownIPs": "3.3.3.3" 
} 

展开操作之后,从退绕操作中产生的所有对象执行的GroupBy操作。所以它会给具有相同Ip的用户数量。

相关问题