推送到MongooseJS子文档而不创建重复项。

3

我有一个用于MongooseJS的List架构,其中每个列表包含一个ListItems数组。每个ListItem只是对Item的引用和isSelected标记。就像这样:

const ListItemSchema = new mongoose.Schema({
  item: { type:mongoose.Schema.Types.ObjectId, ref:'Item' },
  isSelected: Boolean,
});

const ListSchema = new mongoose.Schema({
  name: String,
  items: [ListItemSchema],
});

我只需使用$push就可以将一个Item推送到一个List中。

List.findOneAndUpdate(
    {_id:listId}, 
    {
       $push: {
         items: {item:itemId, isSelected:false}
       }
    }
);

这个方法是可行的,但它允许我将同一个Item多次推送到List中。

在检查重复项的同时,最好的方法是如何添加Items到这种结构中?

1个回答

1
使用 $ne 来避免重复。
List.findOneAndUpdate( {_id:listId},{items.item: {$ne: itemId}} { $push: { items: {item:itemId, isSelected:false} } });

      `

我尝试过了,但似乎没有起作用。即使列表中的另一个项目共享该itemId,{item:itemId,isSelected:false}也将是一个新的独特对象吗? 我如何告诉$addToSetitem字段为关键字? - nicholas
1
可能需要在查询的第一个参数中使用$ne,例如List.findOneAndUpdate({_id:listId},{items.item: {$ne: itemId}},{ $push: { items: {item:itemId, isSelected:false} } }); 这样就可以避免向数组中添加重复项。 - Vaibhav Patil
太棒了!那个完美地解决了问题。谢谢。虽然不是你的第一个答案,但如果你愿意更新,我会接受它作为正确的答案。 - nicholas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接