meteor.js - upsert 不会抛出控制台错误,但不会插入数据

meteor.js - upsert does not throw a console error, but doesn't insert data

我正在尝试使用 upsert 更新或插入数据,但它不起作用。

更新和插入都不起作用... 但我在终端和控制台中都没有看到任何错误。

有人看到我的代码有问题吗?

这是我插入或更新数据的函数内部,我也将 SimpleSchema 用于 Measures 集合。

  questions.forEach(question => {
     Measures.upsert(question._id, {
       $set: {
         title: question.text,
         type:
           question.type === QuestionType.SHORT_ANSWER
             ? MeasureType.TEXT
             : MeasureType.MULTIPLE_CHOICE,
         typeOptions: {frequency},
         shortCodeOptions: {},
         entity: System.getCurrentEntity(),
       },
     });
   });

参考:Meteor Upsert Restricted Collection 403 Error

流星版本:2.5.0

已添加 更新部分已解决。 在本例中为 {_id: question._id} 的选择器实际上并未匹配。

        questions.forEach(question => {
          const questionId = Measures.findOne({questionId: question._id}); // added
          Measures.upsert(
            {_id: questionId?._id},
            {
              $set: {
                title: question.text,
                type:
                  question.type === QuestionType.SHORT_ANSWER
                    ? MeasureType.TEXT
                    : MeasureType.MULTIPLE_CHOICE,
                typeOptions: {frequency},
                shortCodeOptions: {},
                entity: System.getCurrentEntity(),
              },
            },
          );
        });

但是我仍然无法插入新数据,因为如果日期不存在,就没有questionId

我在 {_id: questionId?._id} 中添加了问号只是为了隐藏错误 TypeError: Cannot read properties of undefined (reading '_id') meteor 但这并没有解决问题。

如何插入新数据?

你在这里混淆了东西,我不确定 question 是来自 Measures 集合还是来自不同集合的文档。

选项 A - question 是来自 Measures 集合的文档

如果是这样,您需要摆脱 questionId 并使用 _id

        questions.forEach(question => {
          Measures.upsert(
            { _id: question._id },
            {
              $set: {
                title: question.text,
                type:
                  question.type === QuestionType.SHORT_ANSWER
                    ? MeasureType.TEXT
                    : MeasureType.MULTIPLE_CHOICE,
                typeOptions: {frequency},
                shortCodeOptions: {},
                entity: System.getCurrentEntity(),
              },
            },
          );
        });

选项 B - question 是来自不同集合的文档

然后你需要在 $set:

上显式设置 questionId 作为字段
        questions.forEach(question => {
          Measures.upsert(
            { questionId: question._id }},
            {
              $set: {
                title: question.text,
                questionId: question._id, // required to associate measures with questions
                type:
                  question.type === QuestionType.SHORT_ANSWER
                    ? MeasureType.TEXT
                    : MeasureType.MULTIPLE_CHOICE,
                typeOptions: {frequency},
                shortCodeOptions: {},
                entity: System.getCurrentEntity(),
              },
            },
          );
        });

提示:上下文很重要,这就是为什么您在提问时应该始终弄清楚文档和集合之间的关系。