鍍金池/ 問答/數(shù)據(jù)庫/ mongodb 查詢問題;

mongodb 查詢問題;

數(shù)據(jù)結(jié)構(gòu)

{
    "_id" : ObjectId("59e72a88d416aa6ab8f79d7b"),
    "category_name" : "油",
    "parent_id" : "0",
    "__v" : 0
}

/* 2 */
{
    "_id" : ObjectId("59e72acad416aa6ab8f79d7c"),
    "category_name" : "肉類",
    "parent_id" : "0",
    "__v" : 0
}

/* 3 */
{
    "_id" : ObjectId("59e85b76813a3011280b1186"),
    "category_name" : "芝麻肉",
    "parent_id" : "59e72acad416aa6ab8f79d7c",
    "__v" : 0
}

/* 4 */
{
    "_id" : ObjectId("59e85b84813a3011280b1187"),
    "category_name" : "豬肉",
    "parent_id" : "59e72acad416aa6ab8f79d7c",
    "__v" : 0
}

/* 5 */
{
    "_id" : ObjectId("5a15027971d44b046f83d605"),
    "category_name" : "牛肉油",
    "parent_id" : "59e72a88d416aa6ab8f79d7b",
    "__v" : 0
}

/* 6 */
{
    "_id" : ObjectId("5a1502d871d44b046f83d606"),
    "category_name" : "花生油",
    "parent_id" : "59e72a88d416aa6ab8f79d7b",
    "__v" : 0
}

/* 7 */
{
    "_id" : ObjectId("5a154dd83af2940ba6727a39"),
    "category_name" : "豆油",
    "parent_id" : "59e72a88d416aa6ab8f79d7b",
    "__v" : 0
}

這是我的查詢代碼;結(jié)果達(dá)不到,適合用組合函數(shù)查嗎。還是哪不對了

db.getCollection('categoties').group({
    keyf:function(doc){
        if(doc.parent_id==0){
             return {id:doc._id,name:doc.category_name}
          }else{
           return {id:doc.parent_id}
           }
        },
    reduce:function(obj,prev){
           if(obj.parent_id!=0){
               prev.items.push(obj);
              }
        },
    initial:{items:[]}
    })
 #結(jié)果如下:

[
    {
        "id" : ObjectId("59e72a88d416aa6ab8f79d7b"),
        "name" : "油",
        "items" : []
    },
    {
        "id" : ObjectId("59e72acad416aa6ab8f79d7c"),
        "name" : "肉類",
        "items" : []
    },
    {
        "id" : "59e72acad416aa6ab8f79d7c",
        "items" : [ 
            {
                "_id" : ObjectId("59e85b76813a3011280b1186"),
                "category_name" : "芝麻肉",
                "parent_id" : "59e72acad416aa6ab8f79d7c",
                "__v" : 0
            }, 
            {
                "_id" : ObjectId("59e85b84813a3011280b1187"),
                "category_name" : "豬肉",
                "parent_id" : "59e72acad416aa6ab8f79d7c",
                "__v" : 0
            }
        ]
    },
    {
        "id" : "59e72a88d416aa6ab8f79d7b",
        "items" : [ 
            {
                "_id" : ObjectId("5a15027971d44b046f83d605"),
                "category_name" : "牛肉油",
                "parent_id" : "59e72a88d416aa6ab8f79d7b",
                "__v" : 0
            }, 
            {
                "_id" : ObjectId("5a1502d871d44b046f83d606"),
                "category_name" : "花生油",
                "parent_id" : "59e72a88d416aa6ab8f79d7b",
                "__v" : 0
            }, 
            {
                "_id" : ObjectId("5a154dd83af2940ba6727a39"),
                "category_name" : "豆油",
                "parent_id" : "59e72a88d416aa6ab8f79d7b",
                "__v" : 0
            }
        ]
    }
]

我想要的結(jié)果是這樣的:

[
    {
        "id" : ObjectId("59e72a88d416aa6ab8f79d7b"),
        "name" : "油",
         "items" : [ 
            {
                "_id" : ObjectId("5a15027971d44b046f83d605"),
                "category_name" : "牛肉油",
                "parent_id" : "59e72a88d416aa6ab8f79d7b",
                "__v" : 0
            }, 
            {
                "_id" : ObjectId("5a1502d871d44b046f83d606"),
                "category_name" : "花生油",
                "parent_id" : "59e72a88d416aa6ab8f79d7b",
                "__v" : 0
            }, 
            {
                "_id" : ObjectId("5a154dd83af2940ba6727a39"),
                "category_name" : "豆油",
                "parent_id" : "59e72a88d416aa6ab8f79d7b",
                "__v" : 0
            }
        ]
    },
    {
        "id" : ObjectId("59e72acad416aa6ab8f79d7c"),
        "name" : "肉類",
        "items" : [ 
            {
                "_id" : ObjectId("59e85b76813a3011280b1186"),
                "category_name" : "芝麻肉",
                "parent_id" : "59e72acad416aa6ab8f79d7c",
                "__v" : 0
            }, 
            {
                "_id" : ObjectId("59e85b84813a3011280b1187"),
                "category_name" : "豬肉",
                "parent_id" : "59e72acad416aa6ab8f79d7c",
                "__v" : 0
            }
        ]
    }
]
回答
編輯回答
涼心人

你的parent_id 字段和_id字段的數(shù)據(jù)格式應(yīng)該一致的,這樣設(shè)計(jì)才合理:

以下回答是在你的parent_id 字段和_id字段的數(shù)據(jù)格一致的情況下:
用聚合函數(shù)aggregate

db.getCollection('test').aggregate([
    {$match:{"parent_id" :"0"}},
    {$lookup:{from:'test',localField:'_id',foreignField:'parent_id',as:'items'}}
])
2017年9月17日 23:38