如何查找在数组中具有匹配值的MongoDB记录

时间:2016-01-30 06:11:08

标签: mongodb

我通过将用户IP添加到用户文档中的数组来跟踪用户IP,如下所示:

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

我怎样才能找到knownIPs任意 1 匹配<{1}}中任何}的任何文档(未指定特定内容)价值)无论实际IP是什么。

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

2 个答案:

答案 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的用户数量。