【问题标题】:How to prevent pushing in the document with same attribute in Mongodb如何防止在MongoDB中推送具有相同属性的文档
【发布时间】:2017-06-27 11:04:32
【问题描述】:

我有以下结构。我想防止推入具有相同属性的文档。

例如基本上,我首先找到用户对象。如果我有另一个 vid(已经在里面),它不会被推入。尝试使用 $addToSet,但失败了。

我正在使用猫鼬。

这是我的模型结构:

var User = mongoose.model('User', {
oauthID: Number,
name: String,
username: String,
email: String,
location: String,
birthday: String,   
joindate: Date,
pvideos: Array
});

这是我推入 Mongo 的代码

exports.pinkvideo = function(req, res) {
var vid = req.body.vid;
var oauthid = req.body.oauthid;
var User = require('../models/user.js');

var user = User.findOne({
    oauthID: oauthid
}, function(err, obj) {
    if (!err && obj != null) {
        obj.pvideos.push({
            vid: vid
        });
        obj.save(function(err) {
            res.json({
                status: 'success'
            });
        });

    }
});

};

【问题讨论】:

  • 您在使用$addToSet时遇到了什么错误?
  • 嗨@ashu,没有错误。代码只是没有工作,当我推送一个重复的条目时,它被输入到数据库中

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

您需要.update() 方法,而不是在进行更改后检索文档并使用.save()

这不仅使您可以访问提到的$addToSet 运算符,而且其目的是避免数组中的重复,因为您只将更改发送到数据库而不是整个文档,因此效率更高来回:

User.update(
    { oauthID: oauthid },
    { "$addToSet": { "pVideos": vid } },
    function( err, numAffected ) {
        // check error
        res.json({ status: "success" })
    }
)

唯一可能的问题是它确实取决于您实际推送到阵列上的内容并期望它是唯一的。因此,如果您的数组已经看起来像这样:

[ { "name": "A", "value": 1 } ]

您发送并使用这样的数组元素进行更新:

{ "name": "A", "value": 2 }

那么该文档将不会被视为纯粹基于“名称”中的“A”值而存在,并且会添加一个额外的文档,而不是仅仅替换现有的文档。

因此,您需要注意您的意图是什么,如果这是您正在寻找的那种逻辑,那么您需要找到文档并测试现有数组条目是否符合您想要的条件。

但对于您根本不想添加明确重复的基本场景,那么$addToSet 就是您想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 2021-11-16
    • 1970-01-01
    相关资源
    最近更新 更多