Node.js:无法读取未定义的属性“ then”(嵌套查询)

时间:2019-08-01 12:32:51

标签: javascript node.js mongodb

我正在尝试更新具有嵌套文档的MongoDB集合中的字段。我必须增加一定的价值。更新查询工作正常,但是我需要将其嵌套在另一个获取当前值的查询中,以便增加它。

当我使用错误的find()方法时,嵌套工作得很好。我意识到必须使用aggregate()。我无法正常工作,由于某种原因,该方法返回未定义。我已经在Shell中尝试了相同的聚合查询,并且该查询可以正常工作,因此它必须与Node.js一起做一些事情

失败的功能:

static addPointsToUser(mainId, userId, pointsToAdd) {
  const db = getDb();

  function getCurrent() {
    db.collection('mycoll')
      .aggregate([
        { $match: { _id: mainId } },
        { $unwind: '$userPoints' },
        { $match: { 'userPoints._id:': userId } },
        { $group: { _id: 'userPoints._id', userPoints: { $push: '$userPoints.points' } } }
      ])
  }

  function updateNew(newPoints) {
    db.collection('mycoll')
      .updateOne(
        { _id: mainId },
        { $set: { "userPoints.$[elem].points": newPoints } },
        {
          multi: true,
          arrayFilters: [{ "elem._id": userId }]
        }
      )
  }

  return getCurrent()
    .then(result => {
      console.log(result);
      const newPoints = result.userPoints[0];
      return updateNew(newPoints)
        .then(result => {
          console.log(result);
          return result;
        })
    })
}

文档如下:

{
  "_id": ObjectId("5d4048f56a895612acabe0a9"),

  // Some other fields

  "userPoints": [
    { "_id": "manualID1", "points": 80 },
    { "_id": "manualID2", "points": 90 }
  ]
}

预期的合计结果:

{ "_id" : "manualID1", "userPoints" : [ 90 ] }

Mongo shell提供了上面看到的结果。

实际结果: TypeError:无法读取未定义的属性“ then”

如果我记录汇总结果,它将打印并清空数组([])。

1 个答案:

答案 0 :(得分:5)

您的方法getCurrentupdateNew未返回任何内容。这表示您在错误消息所说明的未定义上使用.then()

return之前添加db.collection('mycoll')语句应该可以帮助您。