Mongo 检查文档是不是已经存在

Posted

技术标签:

【中文标题】Mongo 检查文档是不是已经存在【英文标题】:Mongo check if a document already existsMongo 检查文档是否已经存在 【发布时间】:2014-10-06 00:24:00 【问题描述】:

在我目前正在构建的 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

            );    

        
    );

上面标记的问题是:我需要检查该用户的数据库中是否已经存在该轨道,如果不存在则保存它。然后,一旦循环完成并且所有曲目都已保存或忽略,需要将200 response 发送回我的客户。

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

【问题讨论】:

为什么不创建复合索引db.collection.createIndex( for_user:1, title:1, unique, true ) 这将实现什么? 它将使您能够仅存储这些索引的唯一组合。如果出现重复,您会收到错误 @Bart 我现在不太担心有重复。该应用程序依赖于不断变化的用户 soundcloud 提要,但我想将本地副本保存在我的数据库中。在应用程序决定是否将其保存到数据库之前,我需要检查 soundcloud JSON 中的项目是否已在数据库中。 【参考方案1】:

创建一个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 验证您的对象,因为我们正在绕过猫鼬。

【讨论】:

我不担心重复保存,问题是我想检查 soundcloud JSON 提要中的曲目是否已经在数据库中【参考方案2】:

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

示例 _id : "NicoleMoudaber InTheMOODEpisode14", 艺术家:“妮可·穆达伯” 艺术品:“https://i1.sndcdn.com/artworks-000087731284-gevxfm-large.jpg?e76cf77” 来源:“声云” 流:“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/) 的所有曲目,它仍将使用索引。

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于Mongo 检查文档是不是已经存在的主要内容,如果未能解决你的问题,请参考以下文章

检查elasticsearch中是不是存在文档

如何在 java 中检查集合 mongo db? [复制]

检查 DF 中是不是存在列 - Java Spark

检查 pymongo 中是不是存在文档

如何检查文档是不是存在于flutter中?

xslt - 检查文档是不是存在