代码之家  ›  专栏  ›  技术社区  ›  Stackedo

如何在Mongoose中“合并”查询?

  •  0
  • Stackedo  · 技术社区  · 6 年前

    我在Mongoose中做的两个查询有一些逻辑问题。我有两个查询,我想“合并它们”。 第一个查询采用 非匿名投票 第二个是 匿名投票 . 区别在于第一个 我选择“作者”字段 ,在第二个 我不选择“作者” 字段。

    现在我需要做一个分页来加载零碎的投票,我认为最好只做一个查询。

    因此,以下是查询:

    let notAnonymousPolls = await Poll.find({toUser: user.id, anonymous: false, status: ["closed", "opened", "hidden", "waitingResponse"]})
                    .populate([
                        {path: "replies", select: "text"}, {path: "author", select: "username"}, {path: "replySelected", select: "_id"}
                        ])
                    .select({"__v": 0});
    

    第二

    let anonymousPolls = await Poll.find({toUser: user.id, anonymous: true, status: ["closed", "opened", "hidden", "waitingResponse"]})
                .populate([
                    {path: "replies", select: "text"}, {path: "replySelected", select: "_id"}
                    ])
                .select({"author": 0, "__v": 0});
    

    我的问题是:我怎么能告诉蒙古斯? 如果匿名字段为假,则选择作者 其他 如果匿名字段为真,则不选择作者 ?

    我不知道怎么做这个条件,我可以用哪个操作者来做。我在Mongoose文档中搜索,没有发现任何有用的东西。

    关于分页:如果我有一个查询,它很简单。如果我有两个问题,如何进行分页?使用$slice运算符?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Stackedo    6 年前

    一天之后, 我解决了我的问题 . 有人可以判断聚合是否有效(如果有问题,给我一个建议)?

    allPolls = await Poll.aggregate([
                {
                    $match: {
                        "toUser": ObjectID(user.id),
                        $or: [
                            {status: "opened"},
                            {status: "closed"},
                            {status: "hidden"},
                            {status: "waitingResponse"}
                        ]
                    }
                },
                {
                    $lookup: {
                        "from": "replies",
                        "localField": "replies",
                        "foreignField": "_id",
                        "as": "replies"
                    }
                },
                {
                    $lookup: {
                        "from": "replies",
                        "localField": "replySelected",
                        "foreignField": "_id",
                        "as": "selectedReply"
                    }
                },
                {
                  $lookup: {
                      "from": "users",
                      "localField": "author",
                      "foreignField": "_id",
                      "as": "creator"
                  }
                },
                {
                    $project: {
                        status: 1,
                        toUser: 1,
                        _id: 1,
                        createdAt: 1,
                        question: 1,
                        replies: 1,
                        anonymous: 1,
                        "replySelected._id": 1,
                        "author.username": {
                            $cond: {
                                if: "$anonymous", then: null, else : "$creator.username"
                            }
                        },
                        "author._id": {
                            $cond: {
                                if: "$anonymous", then: null, else : "$creator._id"
                            }
                        },
                    }
                },
                {
                    $skip: 0
                },
                {
                    $limit: 2
                }
    
            ]);
    

    (我尝试了固定的跳过/限制)