检查文档是否已经存在



在我目前正在构建的MEAN应用程序中,客户端使用特定于该用户的soundcloud轨道数据的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来验证您的对象,我们将绕过mongoose。

根据用户和赛道创建唯一的_id。在mongo中,你可以传入你想要使用的_id。

示例{_id: "NicoleMoudaber InTheMOODEpisode14",艺术家:"Nicole Moudaber"作品:"https://i1.sndcdn.com/artworks - 000087731284 - gevxfm large.jpg?e76cf77"来源:"一夜"流:"https://api.soundcloud.com/tracks/162626499/stream.mp3?client_id = 7 d7e31b7e9ae5dc73586fcd143574550"标题:"In The MOOD - Episode 14"}

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

或者您可以找到db.collection的所有曲目。查找({_id:/^NicoleMoudaber/}),它仍然会使用索引

如果你不喜欢这个方法,我可以解释另一个方法。

两个选项都可以在分片环境中工作,也可以在单个副本集中工作。

Soundcloud API提供了一个track id,只需使用它。然后,在插入数据之前,创建一个

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

相关内容

  • 没有找到相关文章

最新更新