根据条件获取内部数组值与mongoose中的其他值

时间:2016-02-03 10:35:15

标签: arrays node.js mongodb mongoose

我的数据库结构如下:

{
    "Title": "AAA",
    "Photos": ["/aaa/aaa.png"],
    "Loc": "XXX",
    "Emp": "SSS",
    "Rate": [{
        "Rating": 2,
        "RateID": "12345654654",
        "RatedDate": new Date()
    }],
    "Fav": [{
        "FavValue": 2,
        "FavID": "1111",
        "FavDate": new Date()
    }]
}

在这里,我想默认获取所有细节。但是从数组中,我需要获得与ID匹配的对象。

In" Rate"数组需要匹配" RateID"并且在" Fav"数组需要匹配" FavID"。

两者"评价"和" Fav"不会总是包含对象。

我尝试过foll mongoose聚合:

ss.aggregate([
        { $unwind: "$Rate" },
        {
            $group: {
                "_id": '$_id',
                "Title": { "$first": "$Title" },
                "Loc": { "$first": "$Loc" },
                "Emp": { "$first": "$Emp" },
                "Photos": { "$first": "$Photos" },
                "Rate":  { $max: { $cond: [ { $eq: [ "$Rate.RateID", new ObjectId(id) ] }, '$Rate.Rating', null ] } },

                "Fav":  { $max: { $cond : [ { $eq : [{ "$size": "$Fav" }, 0]}, null, { $cond: [ { $eq: [ "$Fav.FavID", new ObjectId(id) ] }, '$Fav.FavValue', null ] } ]} }
            }
        }
    ], function (err, AvgResult) {
        res.json({"result": AvgResult});
    });

对于" Rate",如果数组为空,则返回空结果 {}

对于" Fav",如果数组为空或者包含对象,它总是返回null

如果我将ID发送为' 12345654654',结果应该是

{
    "Title": "AAA",
    "Photos": ["/aaa/aaa.png"],
    "Loc": "XXX",
    "Emp": "SSS",
    "Rate": 2,
    "Fav": null
}

如果ID是" 1111",结果应为

{
    "Title": "AAA",
    "Photos": ["/aaa/aaa.png"],
    "Loc": "XXX",
    "Emp": "SSS",
    "Rate": null,
    "Fav": 2
}

如果" Fav" DB中的空数组是" Fav":[]和ID - 是" 12345654654",结果应该如下

{
    "Title": "AAA",
    "Photos": ["/aaa/aaa.png"],
    "Loc": "XXX",
    "Emp": "SSS",
    "Rate": 2,
    "Fav": null
}

任何人都可以帮助在上述所有场景中获得预期的结果。

0 个答案:

没有答案