在Mongoose中插入一个子文档

我试图连续添加子文档到文档中。目标是每个子文档只在数组中出现一次。 如果存在,应该更新。 我认为这被称为“upsert”。

示例架构

var playlistSchema = mongoose.Schema({ name: String, tracks:[ { name: String, artist: String }] }); 

询问

 var query = {'name': 'Playlist1'}, update1 = {'$push': { 'tracks': {'name' : 'First Track', 'artist': 'artist'}}}, update2 = {'$push': { 'tracks': {'name' : 'First Track', 'artist': 'new artist'}}}, update3 = {'$push': { 'tracks': {'name' : 'Second Track', 'artist': 'artist'}}}, options = {upsert: true}; playlistSchema.findOneAndUpdate(query, update1, options, function (err, playlist) {}); playlistSchema.findOneAndUpdate(query, update2, options, function (err, playlist) {}); playlistSchema.findOneAndUpdate(query, update3, options, function (err, playlist) {}); 

我得到了什么

 "name": "Playlist1", "tracks": [{"name": "First Track", "artist": "artist"}, {"name": "First Track", "artist": "new artist"}, {"name": "Second Track", "artist": "artist"}] 

我的目标是什么

 "name": "Playlist1" , "tracks": [{"name": "First Track", "artist": "new artist"}, {"name": "Second Track", "artist": "artist"}] 

也许我必须查询一个特定的子文档,但我不知道如何。

如果您知道轨道已经添加,您可以使用位置更新来更新数组中的元素。

参考

例如:

 db.playlists.update( {'name': 'Playlist1', 'tracks.name': 'First Track'}, {'$set': { 'tracks.$.artist': 'new artist'}} ); 

这将find“Playlist1”,并能够确定它在“第一轨道”匹配的轨道数组中的位置,并将其存储在“$”运算符中。 然后当你更新$ set中的艺术家时,它将覆盖新的variables。

这可能不是你正在寻找的确切的解决scheme,但希望它会指出你在正确的方向。

$ addToSetreplace$ push后 ,它按照预期工作。

 var query = {'name': 'Playlist1'}, update1 = {'$addToSet': { 'tracks': {'name' : 'First Track', 'artist': 'artist'}}}, options = {}; playlistSchema.findOneAndUpdate(query, update1, options, function (err, playlist) {});