首页 > 解决方案 > 修改mongoose查询数据依赖输入数组

问题描述

我在一个数组中有数百个 id。在使用猫鼬分页从此集合中获取记录时,因此我想在结果中添加一个额外的键,如果此数组中存在结果 ID,那么它将添加一个键 is_checked true 否则为 false。但我不想在结果集上运行循环。应该用查询本身来完成

    Existing query

     var pageNo = parseInt(Params.page) || 1;
        var size = parseInt(Params.size) || 10;
        var userId = parseInt(Params.user_id);

        var options = {
            populate: [],
            page: pageNo,
            limit: size
        };
return await this.listModel.paginate({ user_id: userId, deleted_at: null }, options);


Here I am fetching the record from the collection for given userId with pagination

Now I have an array which has array of ids 

var recipientId = ["5ebe7d8355d75d56cbfb4d92", "5ebe7d8355d75d56cbfb4d96", "5ebe7d8355d75d56cbfb4d96"]

My current output is 

{
    "success": true,
    "message": "Data",
    "data": {
        "docs": [
            {
                "_id": "5ebe7d8355d75d56cbfb4d92",
                "name": "test",
                "mobile": "1234567890"
                "__v": 0
            },
            {
                "_id": "5ebe7d8355d75d56cbfb4d93",
                "name": "test one",
                "mobile": "6666"
                "__v": 0
            }  
        ],
        "total": 20,
        "limit": 10,
        "page": 1,
        "pages": 2

    }
}


Excpected Output


{
    "success": true,
    "message": "Data",
    "data": {
        "docs": [
            {
                "_id": "5ebe7d8355d75d56cbfb4d92",
                "name": "test",
                "mobile": "1234567890",
                "is_checked": true
                "__v": 0
            },
            {
                "_id": "5ebe7d8355d75d56cbfb4d93",
                "name": "test one",
                "mobile": "6666",
                "is_checked": false
                "__v": 0
            }  
        ],
        "total": 20,
        "limit": 10,
        "page": 1,
        "pages": 2

    }
}

标签: mongodbmongoose

解决方案


据我了解,您想查询包含 id 数组的记录,并且当该数组中存在某个 id 时,您想添加一个额外的字段 is_checked,true 或 false。

您可以通过聚合来完成,如下例所示,我们正在根据位置搜索记录,但是我们有一个水果数组,如果该数组中存在香蕉,我们将添加一个新字段 has_banana

工作示例 - https://mongoplayground.net/p/2dNYYzJid8S

db.collection.aggregate([
  {
    $match: {
      location: "jaipur"
    }
  },
  {
    $project: {
      "store location": "$location",
      "has_bananas": {
        $in: [
          "bananas",
          "$in_stock"
        ]
      }
    }
  }
])

当您对查询进行分页时,您可以使用$skip$limit


推荐阅读