【问题标题】:Prevent duplicates in an array of objects防止对象数组中的重复项
【发布时间】:2016-02-02 14:07:30
【问题描述】:

我正在学习 Node / Mongoose,并试图弄清楚如何防止 ListItems 数组中的重复:

var listitemSchema = new mongoose.Schema({
   name: String,
   rank: Number
}); 

...存在于用户内部:

var userSchema = new mongoose.Schema({
    username: String,
    password: String,
    list: [{
        type: mongoose.Schema.Types.ObjectId,
     ref: "ListItem"
    }]  
});

...基于用户是否已经在他/她的列表中拥有该名称。我正在研究$addtoset,但无法真正弄清楚在处理对象时如何设置条件。 docs 不是很有帮助,我似乎在网上找不到类似的例子。 现在我的“POST”请求是一团糟,看起来像这样:

router.post("/editlist", isLoggedIn, function(req,res){
    User.findById(req.user._id).populate("list").exec(function(err , user) {
        if(err) {
            console.log(err);
            res.redirect("/editlist");
        } else {
            //prevent duplicates based on username
            User.update(
                { "_id": req.user._id },
                { $addToSet: { "streamName": req.body.listitem.name}
            });
            res.redirect("/watch");
         }
    });
});

谁能送我上路?我的 $addToSet 没有将项目推送到 list 数组中。

【问题讨论】:

  • 为什么要推送到streamName 字段而不是list
  • 是的,那是我的错,不过现在又出现了一个错误

标签: javascript arrays node.js mongodb mongoose


【解决方案1】:

根据$addToSet documentation,操作符是这样使用的:

{ $addToSet: { field1: value1, ... } }

field 是一个数组。

要将项目添加到list 数组,我们这样做:

User.update({
  { "_id": req.user._id },
  { $addToSet: { list: {"streamName": req.body.listitem.name } }}
});

您需要更新userSchema 定义:

var userSchema = new mongoose.Schema({
    username: String,
    password: String,
    list: [listitemSchema]  
});

【讨论】:

  • 嗯我改变了它,但现在我得到“Cast to undefined failed for value "[object Object]" at path "list""
  • 架构定义有问题。我已经更新了答案。
猜你喜欢
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 2019-11-19
  • 2021-08-02
相关资源
最近更新 更多