findOneAndUpdate 数组中的嵌套对象

Ali*_*rdy 5 javascript mongodb node.js

尝试使用findOneAndUpdate()更改 MongoDB 中数组内的对象。我不清楚 mongoDB 的 nodeJS 驱动程序的文档。该文件如下所示:

{
  _id:ObjectID(),
  some: string,
  body: string,
  steps:[
   [0]{name: "foo", state:"Q"},
   [1]{name: "bar", state:"Q"},
   [n]{name: "fooBar", state:"Q"}
 ]
}
Run Code Online (Sandbox Code Playgroud)

我需要查找步骤名称 (foo) 并将其状态设置为 P(进行中),然后在任务已执行时将其状态设置为 C(完成),或者在错误时设置为 E。

然后我还需要获取下一步的名称。

查找文档并不难,因为我已经有了 _id,这是更新部分让我知道的。

编辑:这是我到目前为止

  async msg => {
    const _id = msg.content.toString();
    const id = new objectId(_id);
    logger.info(`${name} consumer - Recieved new task, fetching details`, {
      id
    });
    try {
      const jobDetails = await collection.findOneAndUpdate(
        { _id: id },
        {
          /**/
        }
      );
      await consumer.task(jobDetails);
    } catch (e) {}
  },
Run Code Online (Sandbox Code Playgroud)

这是rabbitMQ消费者的框架

Dan*_*nov 7

我不知道你会如何选择要设置的字母 - P、C 或 E,因为它不太清楚,但是为了替换 mongoDB 中的值,它看起来像这样(假设是“P”):

myCollection.findOneAndUpdate({"_id": docId, "steps.name": "foo"},
    {$set: {"steps.$.state": "P"}})
Run Code Online (Sandbox Code Playgroud)
  1. 找到您需要更改的文档。
  2. 找到数组内的对象"steps.name": "foo"。你会得到该对象在数组中的位置。
  3. 您正在为对象的属性设置新值($反映位置)。