簡體   English   中英

MongoDB Mutation Upsert - 首次提交時無法獲取新記錄的 ID

[英]MongoDB Mutation Upsert - Can't Get Id of New Record on First Submit

我在 MongoDB 上執行更新插入突變以創建新文檔或更新現有文檔。 如果文檔存在,突變會按預期返回 id。 如果創建了一個新文檔,則突變會在初始返回中返回 null(在 Apollo 沙箱中和通過 console.log),然后在后續返回中它將返回 id。 我需要它立即返回新創建文檔的 ID(在第一次返回時),以便我可以在后續操作中使用該 ID。

從頭開始,這里是設置:

類型定義

updateHourByEmployeeIdByJobDate(
      jobDate: String
      startTime: String
      endTime: String
      hoursWorked: String
      employee: String
    ): Hour

解析器

updateHourByEmployeeIdByJobDate: async (
      parent,
      { jobDate, startTime, endTime, hoursWorked, employee },
      context
    ) => {
      // if (context.user) {
      console.log("resolver hours update = ");
      return Hour.findOneAndUpdate(
        { employee, jobDate },
        {
          jobDate,
          startTime,
          endTime,
          hoursWorked,
          employee,
        },
        {
          upsert: true,
        }
      );
      // }
      // throw new AuthenticationError("You need to be logged in!");
    },

突變

//UPDATE HOUR RECORD - CREATES DOCUMENT IF IT DOESN'T EXIST OR UPDATES IF IT DOES EXIST VIA THE UPSERT OPTION ON THE RESOLVER

export const UPDATE_HOURS_BYEMPLOYEEID_BYJOBDATE = gql`
  mutation UpdateHourByEmployeeIdByJobDate(
    $jobDate: String
    $startTime: String
    $endTime: String
    $hoursWorked: String
    $employee: String
  ) {
    updateHourByEmployeeIdByJobDate(
      jobDate: $jobDate
      startTime: $startTime
      endTime: $endTime
      hoursWorked: $hoursWorked
      employee: $employee
    ) {
      _id
    }
  }
`;

前端執行

const [ mostRecentHourUpdateId, setMostRecentHoursUpdateId ] = useState();

  const [updateHours] = useMutation(UPDATE_HOURS_BYEMPLOYEEID_BYJOBDATE, {
    onCompleted: (data) => {
      console.log('mutation result #1 = ', data)
      setMostRecentHoursUpdateId(data?.updateHourByEmployeeIdByJobDate?._id);
      console.log('mutation result #2 = ', mostRecentHourUpdateId)
    },
  });

  //section update database - this mutation is an upsert...it either updates or creates a record
  const handleUpdateDatabase = async (data) => {
    console.log(data);
    
    try {
      // eslint-disable-next-line
      const { data2 } = await updateHours({
        variables: {
          jobDate: moment(data.date).format("MMMM DD YYYY"), //"January 20 2023"
          startTime: `${data.startTime}:00 (MST)`, //"12:00:00 (MST)"
          endTime: `${data.endTime}:00 (MST)`, //"13:00:00 (MST)"
          hoursWorked: data.hours.toString(), //"3.0"
          employee: userId, //"6398fb54494aa98f85992da3"
        },
      });

      console.log('handle update database function = data = ', data2); //fix

    } catch (err) {
      console.error(err);
    }

    singleHoursRefetch();

  };

我已經嘗試使用 onComplete 作為突變請求的一部分以及 useEffect 更不用說在 Apollo Sandbox 中運行突變了。 所有情況下的結果相同。 另一種方法是重新運行 useQuery 以獲取最近/最后創建的記錄,但這似乎是一個具有挑戰性的解決方案(如果在某些時候記錄的排序不同)和/或似乎我應該能夠訪問新創建的記錄立即作為突變結果的一部分。

你會想要使用{ returnNewDocument: true }

像這樣:

const getData = async () => {
    const returnedRecord = await Hour.findOneAndUpdate( { employee, jobDate }, { jobDate, startTime, endTime, hoursWorked, employee, }, { upsert: true, returnNewDocument: true } );
    // do something with returnedRecord
}

getData();

更多信息: https://www.mongodb.com/docs/manual/reference/method/db.collection.findOneAndUpdate/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM