搜尋

首頁  >  問答  >  主體

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文件可參閱麼?

仅有的幸福仅有的幸福2754 天前667

全部回覆(2)我來回復

  • 怪我咯

    怪我咯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中文社群

    三月杭州站在即! ! ! 有興趣的朋友火速報名! ! !

    回覆
    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...

    回覆
    0
  • 取消回覆