【问题标题】:Mongodb simple querying with sub-documents带有子文档的MongoDB简单查询
【发布时间】:2018-12-23 21:31:07
【问题描述】:

我正在尝试查询这个模型:

user = {
  'email': 'test@test.com',
  'pages': [
       {
          'name': 'best page',
          'sessions': [
              {
                 sessionName: 'abc',
              },

          ]
       }, ..
  ]
};

基本上我想从按session._id DESC 排序的一页中选择 3 个会话数据。

User.findOne({ '_id': userId, 'pages._id': pageId })
    .select('pages.sessions')
    .sort({ 'pages.sessions._id': -1 })
    .limit(3)
    .exec(function(err, user) {
        console.log(user);
    });

但没有任何效果..它返回页面数组(而不是 1)。数据未排序,有所有会话而不是 3 个。

我应该改变什么?

编辑:发现我无法对其进行排序,我可以使用slice('pages.sessions') 对其进行限制,但是我怎样才能只获得 1 页而不是数组?

【问题讨论】:

    标签: mongodb mongoose mongodb-query


    【解决方案1】:

    您可以使用以下aggregation

    Users.aggregate([{
        $match: {
            "_id": "1",
            "pages._id": "1"
        }
    }, {
        $project: {
            _id: 1,
            email: 1,
            pages: {
                $filter: {
                    input: '$pages',
                    as: 'pages',
                    cond: { $eq: ['$$pages._id', "1"] }
                }
            }
        }
    }, {
        $unwind: "$pages"
    }, {
        $project: {
            _id: 1,
            email: 1,
            pages: {
                _id: 1,
                name: 1,
                sessions: {
                    $slice: ["$pages.sessions", 3]
                }
            }
        }
    }], function(err, user) {
        console.log(user);
    })
    

    首先$match 需要您的文档_id/pages._id,然后filter pages 数组取决于pages._id。然后$unwindpages就可以slices在下project

    【讨论】:

    • 返回空数组,但我会看看聚合。谢谢。
    • 使用 mongoose.Types.ObjectId(userId, pageId) 解决了这个问题。您是否还知道如何从我编辑的问题中只获得 1 个结果(我猜只使用那个简单的查询 + slice() 会更好地提高性能)?
    • 1 页/结果是什么意思?你能显示你的预期输出吗?
    • 如果我执行 User.findOne({'_id': userId, 'pages._id': pageId }) 它会返回页面数组(属于该用户的所有页面),而不仅仅是带有 _id 的页面: pageId
    • 我已经用一个新的(更简单的)聚合更新了我上面的帖子,但没有 $sort 给出预期的结果
    猜你喜欢
    • 2017-10-01
    • 2014-09-26
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 2016-09-29
    • 1970-01-01
    相关资源
    最近更新 更多