Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在Mongoose中向上插入子文档_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 在Mongoose中向上插入子文档

Node.js 在Mongoose中向上插入子文档,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在尝试向文档中连续添加子文档。目标是每个子文档在数组中只显示一次。如果它存在,它应该被更新。我认为这就是所谓的“向上插入” 示例模式 var playlyschema=mongoose.Schema({ 名称:String, 轨道:[ { 名称:String, 艺术家:弦 }] }); 查询 var query={'name':'playlay1'}, update1={$push':{'tracks':{'name':'First Track','artist':'artist'}},

我正在尝试向文档中连续添加子文档。目标是每个子文档在数组中只显示一次。如果它存在,它应该被更新。我认为这就是所谓的“向上插入”

示例模式
var playlyschema=mongoose.Schema({
名称:String,
轨道:[
{
名称:String,
艺术家:弦
}]
});
查询
var query={'name':'playlay1'},
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'}},
选项={upsert:true};
findOneAndUpdate(查询、更新1、选项、函数(err、playlist){});
findOneAndUpdate(查询、更新2、选项、函数(err、playlist){});
findOneAndUpdate(查询、更新3、选项、函数(err、playlist){});
我得到了什么
“名称”:“播放列表1”,
“曲目”:[{“姓名”:“第一首曲目”,“艺术家”:“艺术家”},
{“姓名”:“第一首曲目”,“艺术家”:“新艺术家”},
{“姓名”:“第二首曲目”,“艺术家”:“艺术家”}]
我的目标是什么
“名称”:“播放列表1”,
“曲目”:[{“姓名”:“第一首曲目”,“艺术家”:“新艺术家”},
{“姓名”:“第二首曲目”,“艺术家”:“艺术家”}]

可能我必须查询特定的子文档,但我不知道如何查询。

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

例如:

db.playlists.update(
    {'name': 'Playlist1', 'tracks.name': 'First Track'}, 
    {'$set': { 'tracks.$.artist': 'new artist'}}
);
这将找到“playli1”,并能够确定它在曲目数组中与“First Track”匹配的位置,并将其存储在“$”操作符中。然后,当您更新$set中的艺术家时,它将用新的变量覆盖该变量


这可能不是您所寻找的确切解决方案,但希望它能为您指明正确的方向。

$push替换为$addToSet后,它将按预期工作

var query = {'name': 'Playlist1'},
    update1 = {'$addToSet': { 'tracks': {'name' : 'First Track', 'artist': 'artist'}}},
    options = {};

playlistSchema.findOneAndUpdate(query, update1, options, function (err, playlist) {});

如果Upsert与查询参数匹配,它将执行更新;如果它与任何内容都不匹配,它将执行插入。请参见此处(ctrl-f表示向上插入):