【问题标题】:Two children with the same key mongodb _id两个孩子具有相同的密钥 mongodb _id
【发布时间】:2021-08-05 14:01:31
【问题描述】:

我收到此错误:
遇到两个孩子使用相同的密钥 610bebf8b6f3820b38b0c613。密钥应该是唯一的,以便组件在更新时保持其身份。非唯一键可能会导致子项重复和/或省略 - 该行为不受支持,并且可能在未来版本中更改

但我使用 mongodb id 所以不可能 2 id 是一样的 当我加载更多项目时会发生这种情况...... 我正在使用 redux 工具包 express mongoose
它有时并不总是发生

平面列表:

<View style={{flex: 1, margin: 10, flexDirection: 'column'}}>
      <Search />
      {users.pending && !users.users.length ? (
        <ActivityIndicator size="large" color="#0000ff" />
      ) : users.users.length === 0 ? (
        <Text>No users</Text>
      ) : (
        <FlatList
          showsVerticalScrollIndicator={false}
          showsHorizontalScrollIndicator={false}
          data={users.users}
          renderItem={({item}) => <Card user={item} />}
          keyExtractor={item => item._id}
          onEndReachedThreshold={0}
          onEndReached={handleLoadMore}
        />
      )}
    </View>

usersSlice:

 getUsersSuccess: (state, action) => {
      state.pending = false;
      if (state.users.length === 0) {
        state.users = action.payload;
      } else {
        state.users = [...state.users, ...action.payload];
      }
      state.skip = state.users.length;
    },

apiCall

export const getUsers = async (dispatch, skip) => {
  dispatch(getUsersStart());
  try {
    const res = await axios.get(`http://10.0.2.2:5000/users?skip=${skip}`);
    dispatch(getUsersSuccess(res.data));
  } catch (error) {
    dispatch(getUsersError());
    console.error('error => ', error.message);
  }
};

服务器:

export const getUsers = async (req, res) => {
  const skip =
    req.query.skip && /^\d+$/.test(req.query.skip) ? Number(req.query.skip) : 0;
  console.log(' req.qury.skip >>>>', req.query.skip);
  try {
    const users = await User.find({}, undefined, { skip, limit: 7 });
    users.map((user) => {
      user.name = decryptString(user.name, process.env.CRYPTO_PASSWORD);
    });
    res.status(200).json(users);
  } catch (error) {
    console.error(error.message);
    res.status(500).json('Server Error');
  }
};

我明白了
virtualizedList:您有一个更新缓慢的大型列表 - 确保您的 renderItem 函数呈现遵循 React 性能最佳实践(如 PureComponent、shouldComponentUpdate 等)的组件。
我考虑删除重复项,但我认为不是好选择

【问题讨论】:

    标签: mongodb react-native express mongoose redux-toolkit


    【解决方案1】:

    但我使用 mongodb id,所以 2 id 不可能相同,当我加载更多项目时会发生这种情况

    您的假设可能有多种错误。 Mongo ID 在数据库中是唯一的,但由于各种原因,您可能会得到重复的值。

    我怀疑 API 给你提供了重叠的数据,你在没有检查的情况下将新数据与旧数据合并 -

    state.users = [...state.users, ...action.payload];
    

    修改它以进行基本的唯一性检查 - 并且只添加旧列表中不存在的元素

    【讨论】:

    • 我做了这个[ ...new Map(arr.map(item => [item._id, item])).values(),];state.users = uniqueObjects;它工作......但它对性能有好处吗?如果我们处理很多对象!有什么方法可以在不映射和删除重复对象的情况下解决它
    • 但这对性能有好处吗?这取决于。因为这仅在加载新项目时运行 - 它可能没问题。记住不要过早地优化东西。如果性能不好 - 您可以在需要时编辑这段逻辑。
    猜你喜欢
    • 2017-06-01
    • 1970-01-01
    • 2019-07-17
    • 2017-05-23
    • 1970-01-01
    • 2011-04-14
    • 2019-02-12
    • 2020-09-16
    • 1970-01-01
    相关资源
    最近更新 更多