Javascript Mongo检查文档是否已经存在

Javascript Mongo检查文档是否已经存在,javascript,mongodb,express,mongoose,mean-stack,Javascript,Mongodb,Express,Mongoose,Mean Stack,在我目前正在构建的MEAN应用程序中,客户端向我的API发出$http POST请求,请求中包含特定于该用户的soundcloud曲目数据的JSON数组。我现在想要实现的是将这些曲目保存到我的应用程序数据库中的“曲目”表下。这样,我就可以从数据库中为该用户加载曲目,还可以创建唯一的客户端URL(/tracks/:track) 一些示例数据: { artist: "Nicole Moudaber" artwork: "https://i1.sndcdn.com/artworks-0

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

            });    

        }
    });
app.post('/tracks/add/new',函数(req,res){
var newTrack;
对于(变量i=0;i
如上所述,我被卡住的地方是:我需要检查该用户的数据库中是否已经存在该轨迹,如果没有,则保存它。然后,一旦循环完成并且所有曲目都被保存或忽略,需要将
200响应
发送回我的客户机

到目前为止,我已经尝试了几种方法,但似乎都不管用,我真的遇到了麻烦,因此非常感谢您提供的帮助/建议。

创建一个独特的。 使用上述索引将确保没有任何文档具有相同的
for_user
stream

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。

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

示例{u id:“Moodepisode14中的NicoleMoudaber”, 艺术家:“妮可·穆达伯” 艺术作品:“ 资料来源:“声云” 流:“?客户端id=7d7e31b7e9ae5dc73586fcd143574550” 标题:“心情-第14集”}

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

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

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


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

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

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

为什么不创建一个复合索引
db.collection.createIndex({for_user:1,title:1},{unique,true})
?这将实现什么?它将允许您只存储这些索引的唯一组合。如果发生以下情况,您将得到一个错误:duplicates@Bart我不太担心这个时候会有重复的。该应用程序依赖于不断变化的用户soundcloud提要,但我想在我的数据库中保存一个本地副本。在应用程序决定是否保存到数据库之前,我需要检查soundcloud JSON中的项目是否不在数据库中。我不担心重复项被保存,问题是我想检查soundcloud JSON提要中的曲目是否已经在数据库中