我通过将用户IP添加到用户文档中的数组来跟踪用户IP,如下所示:
{
"_id": "LafnHzmQL6rBmXNxJ",
"name": "someuser",
"displayName": "SomeUser",
"knownIPs": ["1.1.1.1", "2.2.2.2", "3.3.3.3"]
}
我怎样才能找到knownIPs
中任意 1 匹配<{1}}中任何1>}的任何文档(未指定特定内容)价值)无论实际IP是什么。
目标是识别使用多个帐户的人员,以便可以通过编程方式标记这些帐户以进行进一步检查。我有超过40,000个用户,这会过于密集吗?
答案 0 :(得分: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 :(得分:1)
我认为你应该在knownIPs数组上使用$ unwind函数。这样它就会从父对象中为你提供三个子对象。
例如:
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的用户数量。