如何在添加到数组之前检查NESTED数组项是否已存在

时间:2015-07-23 12:33:19

标签: node.js mongodb

我正在为Mongo中的嵌套数组项创建并分配一个新的对象id,这非常有用。我无法弄清楚如何检查该对象ID以验证它尚不存在。

这是路线:

router.post('/events', function(req,res){
    var loggedInUser = req.user.username;
    var objectId = new ObjectID();

    User.update(
        {"username" : loggedInUser},
        {
            $push:{
                primaryEvents:{
                    _id: objectId,
                    name: req.body.name,
                    date: req.body.date,
                    description: req.body.description
                }
            }
        },
        {upsert:true},
        function(err){
            console.log('made it to the calback');
            if(err)
                res.send(err);
            res.render('index', {
                user: req.user,
                primaryEvents: req.user.primaryEvents
            });
        }
    );
});

1 个答案:

答案 0 :(得分:0)

您想要使用$ne不等运算符检查数组中没有值:

        User.update(
            { 
                "username" : loggedInUser,
                "primaryEvents._id": { "$ne": objectid }
            },
            {
            $push:{
                primaryEvents:{
                    _id: objectId,
                    name: req.body.name,
                    date: req.body.date,
                    description: req.body.description
                }
            }
            },
            {upsert:true},
            function(err){
                console.log('made it to the calback');
                if(err)
                    res.send(err);
                res.render('index', { 
                    user: req.user,
                    primaryEvents: req.user.primaryEvents
                });
            }
        );

这将检查数组中子文档的所有命名属性,并确保该值不存在。

因此“查询”部分是您控制它的地方。如果您的值已经有_id,那么就没有匹配,因此没有更新。

否则,如果您不知道_id值,请选择您认为唯一的其他内容,例如“name”:

        User.update(
            { 
                "username" : loggedInUser,
                "primaryEvents.name": { "$ne": req.body.name }
            },
            {
            $push:{
                primaryEvents:{
                    _id: objectId,
                    name: req.body.name,
                    date: req.body.date,
                    description: req.body.description
                }
            }
            },
            {upsert:true},
            function(err){
                console.log('made it to the calback');
                if(err)
                    res.send(err);
                res.render('index', { 
                    user: req.user,
                    primaryEvents: req.user.primaryEvents
                });
            }
        );