MongoDB:使用聚合/投影获取嵌套在数组中的对象的所有内容

时间:2018-02-21 03:40:09

标签: node.js mongodb mongoose nested

我在使用投影/聚合返回嵌套数组myShows.showChoices内的对象时遇到问题。 (如果这是接近这个的正确方法)。

每当我尝试通过查找节目的名称或ID来尝试使用.find()时,它只会返回名称或Id而没有任何其他内容。我正在尝试返回该对象的所有内容。包括名称,概述,poster_path等...(基本上是对象本身)

我的架构:

const userSchema = new Schema({
email:{
    type: String,
    unique: true,
    lowercase: true,
    trim: true,
    required: 'Please Provide an email address'
},
name: {
    type: String,
    required: 'Please supply a name',
    trim: true,
},
myShows: {
    topRated: [],
    showChoices: []
});

我推入myShows.showChoices的对象看起来像

{
 name: "Name of Show",
 poster_path:"/x2WKIbiwhLoWgLFbT2I0Gwq8U1J.jpg",
 genre_ids: [37, 878],
 overview: "show description",
 id: 63247
}

我试过了:

const show = await User.find(
    { _id: req.user.id },
    { showChoices: { $elemMatch: { name: "Name of Show" } }   }
)

更新:1

投影/聚合的几种变体。这是我最近的尝试。 (坚持在最后一场比赛之后该做什么。)

const show = await User.aggregate([
            { "$match": {
              "_id" :  req.user._id,
              "myShows.showChoices.id": showIDVar
            }},
            { $unwind: "$myShows.showChoices" },
            { $match: {
                "myShows.showChoices.id": showIDVar
            }},
        ])

我认为我过去的.find()查询的问题是我只搜索节目的名称或ID(不是_id)

const show = await User.find(
        { _id: req.user.id },
        { "myShows.showChoices": { name: "Name of Show" }   }
    )

这只会返回节目本身的名称。无论如何只通过查询名称来返回对象的所有内容?

有关如何处理此事的任何建议?

        // Expected output is to have 
const show =
        {
         name: "Name of Show",
         poster_path:"/x2WKIbiwhLoWgLFbT2I0Gwq8U1J.jpg",
         genre_ids: [37, 878],
         overview: "show description",
         id: 63247
        };

1 个答案:

答案 0 :(得分:0)

你快到了;只需要添加$project阶段:

const show = await User.aggregate([
            { "$match": {
              "_id" :  req.user._id,
              "myShows.showChoices.id": showIDVar
            }},
            { $unwind: "$myShows.showChoices" },
            { $match: {
                "myShows.showChoices.id": showIDVar
            }},
            { $project: {
                "myShows.showChoices.name": 1,
                "myShows.showChoices.poster_path": 1,
                "myShows.showChoices.genre_ids": 1,
                "myShows.showChoices.overview":1


            }},
        ])