Mongo检查文档是否已存在

时间:2014-08-12 19:36:02

标签: javascript mongodb express mongoose mean-stack

在我正在构建的MEAN应用程序中,客户端向我的API发出$ http POST请求,其中包含特定于该用户的JSON阵列的soundcloud轨道数据。我现在想要实现的是将这些曲目保存到我的应用数据库中的轨道下。表。这样,我就可以从数据库加载该用户的曲目,还可以创建唯一的客户端网址(/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发送回我的客户端。

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

3 个答案:

答案 0 :(得分:0)

创建compound index并使其唯一。 使用上述索引将确保没有具有相同for_userstream的文档。

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

现在使用mongoDB批处理操作来insert多个文档。

//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验证您的对象,我们绕过了猫鼬。

答案 1 :(得分:0)

根据用户和曲目制作唯一的_id。在mongo中,您可以传入要使用的_id。

示例{_id:&#34; NicoleMoudaber InTheMOODEpisode14&#34;,          艺术家:&#34; Nicole Moudaber&#34;          艺术品:&#34; https://i1.sndcdn.com/artworks-000087731284-gevxfm-large.jpg?e76cf77&#34;          来源:&#34; soundcloud&#34;          流:&#34; https://api.soundcloud.com/tracks/162626499/stream.mp3? CLIENT_ID = 7d7e31b7e9ae5dc73586fcd143574550&#34;          标题:&#34;在MOOD中 - 第14集&#34;}

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

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

还有另一种方法可以解释,如果你不这样做的话。喜欢这个。

这两个选项都可以在分片环境和单个副本集中使用。 &#34;独特&#34;索引在分片环境中不起作用。

答案 2 :(得分:0)

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

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