【问题标题】:mongodb find elements in Arraymongodb在数组中查找元素
【发布时间】:2016-05-05 21:30:07
【问题描述】:

我正在玩 mongodb,但在查找数组中的元素时遇到了麻烦

我的收藏是这样的

{
        "_id" : ObjectId("4c4b1476238d3b4dd5000002"),
        "username" : "pbakkum",
        "first_name" : "Peter",
        "last_name" : "Bakkum",
        "age" : 21,
        "addresses" : [
                {
                        "name" : "home",
                        "street" : "588 5th Street",
                        "city" : "Brooklyn",
                        "state" : "CA",
                        "zip" : 11215
                },
                {
                        "name" : "work",
                        "street" : "588 5th Street",
                        "city" : "Brooklyn",
                        "state" : "CA",
                        "zip" : 11215
                },
                {

                }
        ]
}
{
        "_id" : ObjectId("4c4b1476238d3b4dd5000001"),
        "username" : "kbanker",
        "email" : "kylebanker@gmail.com",
        "first_name" : "Kyle",
        "last_name" : "Banker",
        "hashed_password" : "bd1cfa194c3a603e7186780824b04419",
        "addresses" : [
                {
                        "name" : "home",
                        "street" : "588 5th Street",
                        "city" : "Brooklyn",
                        "state" : "NY",
                        "zip" : 11215
                },
                {
                        "name" : "work",
                        "street" : "1 E. 23rd Street",
                        "city" : "New York",
                        "state" : "NY",
                        "zip" : 10010
                }
        ],
        "payment_methods" : [
                {
                        "name" : "VISA",
                        "last_four" : 2127,
                        "crypted_number" : "43f6ba1dfda6b8106dc7",
                        "expiration_date" : ISODate("2016-05-01T07:00:00Z")
                }
        ],
        "age" : 151
}

当我触发类似这样的查询时。

db.users.find({"addresses.name":"home","addresses.state":"NY"});

此查询的输出是一条用户名为 kbanker 的记录

这意味着它与参数 "name":"home 和addresses.state:NY 完全匹配并且只返回一条记录。

但是根据我的理解,这应该返回两个记录,因为它应该检查 enitre 数组中的任何参数 "name":"home" 和addressss.state:NY,如果它们中的任何一个匹配它应该显示那个记录。

这种只选择一条记录的行为违背了 $elemMatch 属性的目的?

我是对的还是新版本的 mongodb 发生了一些变化。 我正在使用 3.2.5

【问题讨论】:

    标签: arrays mongodb mongodb-query


    【解决方案1】:

    让我试着用你的数据集解释一下

    db.foo.insert({
            "username" : "pbakkum",
            "addresses" : [
                    {
                            "name" : "home",
                            "state" : "CA"
                    },
                    {
                            "name" : "work",
                            "state" : "CA"
                    }
            ]
    });
    db.foo.insert({
            "username" : "kbanker",
            "addresses" : [
                    {
                            "name" : "home",
                            "state" : "NY"
                    },
                    {
                            "name" : "work",
                            "state" : "NY"
                    }
            ]
    });
    

    当您执行查询 db.foo.find({"addresses.name":"home","addresses.state":"NY"}); mongo 在数组中搜索具有“home”和“NY”的文档时,这些值是否在同一个文档中并不重要。

    > db.foo.find({"addresses.name":"home","addresses.state":"NY"}, { "_id":0, "user
    name" :1, "addresses" :1 })
    { "username" : "kbanker", "addresses" : [ { "name" : "home", "state" : "NY" }, {
     "name" : "work", "state" : "NY" } ] }
    

    如您所见,在其中一个数组文档中包含“home”和“NY”就足够了,与 $elemMatch 的区别在于它们(“home”和“NY”)都需要在同一份文件。

    让我们在用户名 pbakkum 的数组中添加另一个文档。

    db.foo.insert({
            "username" : "pbakkum",
            "addresses" : [
                    {
                            "name" : "home",
                            "state" : "CA"
                    },
                    {
                            "name" : "work",
                            "state" : "CA"
                    },
                    {
                            "name" : "work",
                            "state" : "NY"  // Adding NY to make the match of your query
                    }
            ]
    });
    

    运行相同的查询,这次您将看到两条记录,因为它们在数组中的一个文档中都包含“home”和“NY”

    > db.foo.find({"addresses.name":"home","addresses.state":"NY"}, { "_id":0, "user
    name" :1, "addresses" :1 })
    { "username" : "pbakkum", "addresses" : [ { "name" : "home", "state" : "CA" }, {
     "name" : "work", "state" : "CA" }, { "name" : "work", "state" : "NY" } ] }
    { "username" : "kbanker", "addresses" : [ { "name" : "home", "state" : "NY" }, {
     "name" : "work", "state" : "NY" } ] }
    

    $elemMatch 只获取同一文档中完全匹配的文档(“home”和“NY”)

    > db.foo.find( { addresses : {$elemMatch : {"name":"home","state":"NY"}}}, { "_i
    d":0, "username" :1, "addresses" :1 })
    { "username" : "kbanker", "addresses" : [ { "name" : "home", "state" : "NY" }, {
     "name" : "work", "state" : "NY" } ] }
    

    这意味着它完全匹配两个参数 "name":"home andaddresses.state:NY 并且只返回一条记录。

    是的,查询匹配两个参数,但如果它们在同一个文档中,则不感兴趣,这只是巧合。

    【讨论】:

      猜你喜欢
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 1970-01-01
      相关资源
      最近更新 更多