首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在具有不同查询参数的嵌套数组中查找对象数

在具有不同查询参数的嵌套数组中查找对象数
EN

Stack Overflow用户
提问于 2021-11-29 02:13:41
回答 2查看 58关注 0票数 0

我有这个事件数组,但不知道如何查询“来宾”嵌套数组,并做两件事。

  1. 数一数客人人数
  2. 统计出席的客人人数(标有“Y”) { _id:新ObjectId('1'),名称: event1,来宾:{电话:+12222222222,_id:新ObjectId,与会者:'Y‘},{电话:+12344466666,_id:新ObjectId,已出席:'Y’},{ phone:+11234567890,_id: new ObjectId,guests:},{ phone:+14443332222,_id:新ObjectId,出席了:'Y‘},{ phone:+19090909090,_id: new ObjectId guests:},},{ _id: new ObjectId('2'),名称: event2,来宾:{ phone:+11111111111,_id: new ObjectId,出席了:},{ phone:+12222222222,_id: new ObjectId,出席会议:'Y‘},{ phone:+133333333333,_id:新ObjectId,已出席:'Y’},},

下面的代码是在第20次迭代中进行的,并没有进一步接近。

代码语言:javascript
复制
const event = await Event.findById(req.params.id);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-29 03:57:41

对于MongoDB查询,可以使用$size计算数组字段的大小,并使用$filter筛选与投影中的条件匹配的特定文档。

代码语言:javascript
复制
db.collection.find({
  _id: "1"
},
{
  _id: 1,
  name: 1,
  guests: 1,
  totalGuests: {
    $size: "$guests"
  },
  attendedGuests: {
    $size: {
      "$filter": {
        input: "$guests",
        cond: {
          $eq: [
            "$$this.attended",
            "Y"
          ]
        }
      }
    }
  }
})

蒙戈游乐场样本

票数 0
EN

Stack Overflow用户

发布于 2021-12-02 02:55:17

勇顺帮了上面的忙,但没有得到百分之百的帮助--这是一个完整的答案,以防任何人在将来遇到这样的事情:

代码语言:javascript
复制
module.exports.showEvent = async (req, res) => {
    const event = await Event.findById(req.params.id).populate('artist');
    const { guest_id } = req.cookies;
    let totalGuests = 0;
    let attendedGuests = 0;
    const eventData = await Event.aggregate([
        {
            "$match": {
                "_id": objectId(req.params.id)
            }
        },
        {
            $project: {
                _id: 1,
                name: 1,
                guests: 1,
                totalGuests: { $cond: { if: { $isArray: "$guests" }, then: { $size: "$guests" }, else: "NA" } },
                attendedGuests: {
                    $size: {
                        $filter: {
                            input: "$guests",
                            as: "guest",
                            cond: {
                                $and: [{
                                    $eq: ["$$guest.attended", "Y"]
                                }]
                            }
                        }
                    }
                }
            }
        }
    ])
    if (eventData && Array.isArray(eventData) && eventData.length > 0) {
        totalGuests = eventData[0].totalGuests;
        attendedGuests = eventData[0].attendedGuests;
    }
    if (!event) {
        req.flash('error', 'Cannot find that Event');
        return res.redirect('/events');
    }
    res.render('events/show', { event, eventData });
    console.log(totalGuests, attendedGuests);
};    
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70149103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档