繁体   English   中英

我如何优化 Mongoose 中的以下查询?

[英]How can i optimize below query in Mongoose?

基本上,我想从集合中获取数据,其中 pincode 字段(在 Location 数组内)与req.body匹配我得到我想要的 output 但我不确定它是否是优化方式(查看 Mongoose 查询部分)

这是我的 Json:

{
    "_id" : ObjectId("6115b2cc1681596a10072f97"),
    "vendorStatus" : "Active",
    "name" : "harshit singh bhutani",
    "email" : "sharsh2106@gmail.com",
    "vId" : 12121,
    "contact" : 121212,
    "cities" : "dell",
    "isMidnight" : "NA",
    "location" : [ 
        {
            "delivery" : 1266,
            "dc" : "High",
            "midnight" : "Active",
            "isLive" : "NA",
            "_id" : ObjectId("612433c27292d11154bc4d4d"),
            "pincode" : 123100,
            "city" : "dek"
        }, 
        {
            "delivery" : 23,
            "dc" : "High",
            "midnight" : "Active",
            "isLive" : "NA",
            "_id" : ObjectId("612441473cb5766a2457d6db"),
            "pincode" : 1212,
            "city" : "dd"
        }
    ],
    
    "createdAt" : ISODate("2021-08-12T23:46:20.407Z"),
    "updatedAt" : ISODate("2021-09-03T10:51:34.756Z"),
    "__v" : 73
}

这是我在 Mongoose 中的查询:

  const { pin } = req.body;
  const vendor = await Vendor.find({ vendorStatus: "Active" });

  const pincode = vendor.map((item) => {
    return item.location.find((i) => {
      if (i.pincode === Number(pin) && i.isLive === "Active") {
        return i;
      }
    });
  });

  const pincodefound = pincode.filter(Boolean);
  if (pincodefound.length === 0) {
    res.status(404);
    throw Error("Product is not Deliverable at this Pincode");
  } else {
    return res.json({
      pincodefound,
    });
  }

首先,我使用 map 进行迭代,然后我使用 find 来获取匹配的密码,之后我得到了 output 和 null 值的数组,所以我使用过滤器只获取密码,虽然我得到了我想要的 output 但我仍然不确定它的天气优化方法与否。

如果我正确理解了您的 JS 代码,您只想将符合条件的值获取到location数组中。

在这种情况下,这是一种在查询中完成所有操作的更好方法。 您可以使用聚合管道。

这个查询:

  • 首先匹配vendorStatus: "Active像您的find查询一样活跃。
  • 然后使用$unwind解构数组并查看每个值。
  • $match找到一个值,其中pincodeisLive是所需的值。
  • 最后一个阶段是$project以仅显示您想要的值,在本例中为位置值。
const pincode = await Vendor.aggregate([
  {
    "$match": {
      "vendorStatus": "Active"
    }
  },
  {
    "$unwind": "$location"
  },
  {
    "$match": {
      "location.pincode": pin,
      "location.isLive": "Active"
    }
  },
  {
    "$project": {
      "delivery": "$location.delivery",
      "dc": "$location.dc",
      "midnight": "$location.midnight",
      "isLive": "$location.isLive",
      "_id": "$location._id",
      "pincode": "$location.pincode",
      "city": "$location.city"
    }
  }
]);

这里的例子

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM