如何在js的地图函数中填充数组并将其发送到服务器?

时间:2020-06-18 13:31:04

标签: javascript node.js arrays

这是我的ObjectIds数组-

obj_ids = [
    "5ee71cc94be8d0180c1b63db",
    "5ee71c884be8d0180c1b63d9",
    "5ee71c494be8d0180c1b63d6",
    "5ee71bfd4be8d0180c1b63d4"
]

我正在使用这些对象ID来查询它们是否存在于数据库中,并基于此对象将响应发送到服务器。 这是我正在尝试的代码,但我不知道如何填充数组并将其发送到服务器。

var msg = [];
obj_ids.map((ele) => {
    Lead.find({ _id: ele._id }, async function (error, docs) {
        if (docs.length) {
            msg.push(
                `Lead already exist for Lead id - ${ele._id} assgined to ${docs[0].salesPerson}`
            );
        } else {
            msg.push(`Lead doesn't exist for Lead id: ${ele._id}`);
            const newDuty = new AssignedDuty({
                duty: ele._id,
                salesPerson: req.body.salesPerson,
            });

            await newDuty.save();
        }
    });
});
res.json(msg);

通过这种方法,我得到了一个空数组。我无法将res.json(msg)放入循环中。如果可以使用async-await,请指导我。

1 个答案:

答案 0 :(得分:0)

您无需进行多次查询即可查找数据库中是否存在给定的对象ID。

使用$in运算符,您可以进行一次查询,该查询将返回_id等于列表中的对象ID之一的所有文档。

const docs = await Lead.find({
    _id: {
        $in: [
          "5ee71cc94be8d0180c1b63db",
          "5ee71c884be8d0180c1b63d9",
          "5ee71c494be8d0180c1b63d6",
          "5ee71bfd4be8d0180c1b63d4"
       ]
    }
});

查询之后,您可以检查docs数组中存在哪个对象ID,不存在哪个对象。

有关$in运算符的详细信息,请参见$in comparison operator

您的代码可以简化,如下所示:

const obj_ids = [
    "5ee71cc94be8d0180c1b63db",
    "5ee71c884be8d0180c1b63d9",
    "5ee71c494be8d0180c1b63d6",
    "5ee71bfd4be8d0180c1b63d4"
];

const docs = await Lead.find({
    _id: { $in: obj_ids }
});

const msg = [];

obj_ids.forEach(async (id) => {
    const doc = docs.find(d => d._id == id);

    if (doc) {
        msg.push(
            `Lead already exist for Lead id - ${doc._id} assgined to ${doc.salesPerson}`
        );
    }
    else {
        msg.push(`Lead doesn't exist for Lead id: ${id}`);
        const newDuty = new AssignedDuty({
            duty: id,
            salesPerson: req.body.salesPerson
        });

        await newDuty.save();
    }
});

res.json(msg);