suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Mongodb经过条件查询后获取的是整个文档?

例如有组数据:

name: 'food',
data: {
    fruit: [
        {
            name: 'apple',
            stock: 10
        },
        {
            name: 'pear',
            stock: 66
        }
        ...
    ]
            
}

db.col.find({'data.fruit.stock': 66}, {data.fruit.stock: 1})

查询到的是整个data.fruite;

Q1: 有什么方法只获取过滤器查询的那条数据吗?如果这个文档对象量比较大咋办?
Q2: 这是Mongodb的一种特性?命中过滤器的条件后,返回的是整个文档对象?
Q3: 有这方面的API文档可参阅么?

仅有的幸福仅有的幸福2811 Tage vor714

Antworte allen(2)Ich werde antworten

  • 怪我咯

    怪我咯2017-05-02 09:26:53

    题主问的这个问题其实是和Data Model和业务查询上的权衡有关联。

    1、MongoDB 每次返回的基本上是以文档 document为单位的,如果文档中包含数组(Array),也是需要返回所有数组的;

    2、如题主所愿,如果想按照查询条件,只是返还数组中的满足条件的数据,可以考虑

    1)重新设计data model,不使用数组嵌套;
    
    2)使用$unwind,将数组按照Flat展开,可以参考下面这个帖子:     
    

    /q/10...

    供参考。

    Love MongoDB! Have Fun!

    ------------------------华丽的分割符--------------------------------

    MongoDB中文社区线下活动缤纷,请猛戳下方:

    2017华山论剑|MongoDB中文社区

    三月份杭州站在即!!! 感兴趣的朋友火速报名!!!

    Antwort
    0
  • 漂亮男人

    漂亮男人2017-05-02 09:26:53

    > db.example.find().pretty()
    {
        "_id" : ObjectId("58b50cd6a7329db9121efa00"),
        "name" : "food",
        "data" : {
            "fruit" : [
                {
                    "name" : "apple",
                    "stock" : 10
                },
                {
                    "name" : "pear",
                    "stock" : 66
                }
            ]
        }
    }
    > db.example.find({'data.fruit.stock':66}, {'data.fruit.stock': 1}).pretty()
    {
        "_id" : ObjectId("58b50cd6a7329db9121efa00"),
        "data" : {
            "fruit" : [
                {
                    "stock" : 10
                },
                {
                    "stock" : 66
                }
            ]
        }
    }

    确实会返回data.fruit数据的stock;但也可以返回条件的stock,但要知道stock在fruit数组的index数.

     {'data.fruit.1.sock': 1}

    参考(mongodb 版本 3.4):
    https://docs.mongodb.com/manu...
    https://docs.mongodb.com/manu...

    Antwort
    0
  • StornierenAntwort