2016-01-30 118 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的用戶數量。

相關問題