UpdateOne返回猫鼬对象,而不是文档

时间:2019-03-01 12:45:24

标签: mongoose

运行此查询时:

  const project = await models.Projects
    .updateOne(
      { _id: projectId },
      {
        $addToSet:
        {
          membersIds:
          {
            $each: membersIds
          },
        },
      },
    );

我得到的答复是:

{ n: 1, nModified: 1, ok: 1 }

是否可以获取更新的对象而不是此猫鼬数据?

4 个答案:

答案 0 :(得分:2)

注意!

我看到了回复,没问题,但是,请注意添加 new 选项并将其设置为true查询以获取新的更新文档,否则它将在更新之前返回文档:

    models.Projects.findByIdAndUpdate(
    { "_id": projectId }, 
    { $addToSet:{ membersIds: { $each: membersIds }}})
   .exec()
   .then((response) => {
          console.log('document before updating =>', response);
        });

    models.Projects.findByIdAndUpdate(
        { "_id": projectId }, 
        { $addToSet:{ membersIds: { $each: membersIds }}}, 
        {new: true})
       .exec()
       .then((response) => {
              console.log('document after updating =>', response);
            });

答案 1 :(得分:1)

使用 findByIdAndUpdate 获取更新的文档。因此,从您的代码中,只需更改为:

const project = await models.Projects.findByIdAndUpdate(
  {_id: projectId},
  {
    $addToSet:
    {
      membersIds:
      {
        $each: membersIds
      },
    },
  },
  {new: true}
)

不要忘记添加一个选项 {new: true},它将更新的文档返回到您的项目变量。

答案 2 :(得分:0)

docs[callback] «Function» params are (error, writeOpResult)开始,这意味着无法使用updateOne方法返回文档。

但是可以使用提供updateOne选项的findByIdAndUpdate来代替lean: true

答案 3 :(得分:0)

如果更新操作后将不使用文档,则应使用 updateOne ,它更快。然而;如果需要更新的文档,则应使用findByIdAndUpdatefindOneAndUpdate。您可以仅使用带有 findByIdAndUpdate 的_id进行过滤,但是可以使用带有 findOneAndUpdate 的每个现有字段过滤器。