繁体   English   中英

Mongo检查文档是否已经存在

[英]Mongo check if a document already exists

在我当前正在构建的MEAN应用中,客户端使用针对该用户的JSON音云跟踪数据数组向我的API发出$ http POST请求。 我现在想要实现的是将这些轨道保存到“轨道”表下的我的应用程序数据库中。 这样,我便能够从数据库中为该用户加载曲目,并且还能够创建唯一的客户端URL (/tracks/:track)

一些示例数据:

{
    artist: "Nicole Moudaber"
    artwork: "https://i1.sndcdn.com/artworks-000087731284-gevxfm-large.jpg?e76cf77"
    source: "soundcloud"
    stream: "https://api.soundcloud.com/tracks/162626499/stream.mp3?client_id=7d7e31b7e9ae5dc73586fcd143574550"
    title: "In The MOOD - Episode 14"
}

然后将这些数据传递给API,如下所示:

app.post('/tracks/add/new', function (req, res) {
     var newTrack;
     for (var i = 0; i < req.body.length; i++) {

        newTrack = new tracksTable({
            for_user: req.user._id,
            title: req.body[i].title,
            artist: req.body[i].artist,
            artwork: req.body[i].artwork,
            source: req.body[i].source,
            stream: req.body[i].stream
        });

        tracksTable.find({'for_user': req.user._id, stream: req.body[i].stream}, function (err, trackTableData) {

            if (err)
                console.log('MongoDB Error: ' + err);

            // stuck here - read below

            });    

        }
    });

如上所示,我被卡住的地方是:我需要检查该用户的数据库中是否已存在该轨道,如果没有,则将其保存。 然后,一旦循环结束并且所有轨道都已保存或忽略,则需要将200 response发送回我的客户端。

到目前为止,我已经尝试了几种方法,但似乎没有任何效果,我真的遇到了麻烦,因此,非常感谢您提供帮助/建议。

创建一个复合索引并使它唯一。 使用上述索引将确保没有文档具有相同的for_userstream

trackSchema.ensureIndex( {for_user:1, stream:1}, {unique, true} )

现在,使用mongoDB批处理操作插入多个文档。

//docs is the array of tracks you are going to insert.

trackTable.collection.insert(docs, options, function(err,savedDocs){
 //savedDocs is the array of docs saved.
 //By checking savedDocs you can see how many tracks were actually inserted
})

确保通过使用.collection绕过猫鼬来验证您的对象。

根据用户和跟踪创建唯一的_id。 在mongo中,您可以传递要使用的_id。

示例{_id:“ NicoleMoudaber InTheMOODEpisode14”,艺术家:“ Nicole Moudaber”艺术品:“ https://i1.sndcdn.com/artworks-000087731284-gevxfm-large.jpg?e76cf77 ”来源:“ soundcloud”流:“ https: //api.soundcloud.com/tracks/162626499/stream.mp3?client_id = 7d7e31b7e9ae5dc73586fcd143574550“标题:”在心情-第14集“}

_id必须是唯一的,并且不允许您插入另一个具有相同_id的文档。 您还可以使用它在以后查找记录db.collection.find({_ id:NicoleMoudaber InTheMOODEpisode14})

或者您可以找到db.collection.find({_ id:/ ^ NicoleMoudaber /})的所有轨道,它仍将使用索引。

有另一种方法可以解释您是否不喜欢这种方法。

这两个选项都将在分片环境以及单个副本集中工作。 “唯一”索引在分片环境中不起作用。

Soundcloud API提供了一个曲目ID,只需使用它即可。 然后在插入数据之前

tracks.find({id_soundcloud : 25645456}).exec(function(err,track){ 
    if(track.length){ console.log("do nothing")}else {//insert}
 });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM