Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.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
Javascript Mongoose/Mongodb findOneAndUpdate,同时保留已存在的内容_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript Mongoose/Mongodb findOneAndUpdate,同时保留已存在的内容

Javascript Mongoose/Mongodb findOneAndUpdate,同时保留已存在的内容,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我通过mongoose在数据库中为每个用户保存了许多项,项在Userschema中的项(数组)中结束。 如何让mongodb在保留已存在的项目的同时findOneAndUpdate?因为现在更新基本上覆盖了该用户数据库中的整个项数组 我所拥有的是: var filter = { 'id': thisId }; let update = { 'item': itemsArray, 'updat

我通过mongoose在数据库中为每个用户保存了许多项,项在
User
schema中的项(数组)中结束。 如何让mongodb在保留已存在的项目的同时
findOneAndUpdate
?因为现在更新基本上覆盖了该用户数据库中的整个项数组

我所拥有的是:

            var filter = { 'id': thisId };
            let update = { 
              'item': itemsArray,
              'updatedAt': Date.now()
            };

            User.findOneAndUpdate(filter, update, {upsert: true, new: true}, function(err, doc) {
                if (err) return res.send(500, {error: err});
                return;
            });
我在mongodb文档中读到了
$addToSet
,但这是我需要的吗?如何将其应用于我的查询

更新:下面建议的
$set
不起作用。 我的示例:我在字段'item'中获取400个项目,然后使用基于上次更新日期的条件,我第二次获取50个项目,现在让我们假设在这50个项目中,有一个项目在先前添加的400个项目中不存在,我希望它将该项目添加到400个项目中。 取而代之的是,我现在在'item'字段中找到了总共50个项目

我找到的解决方案

User.findOneAndUpdate(filter, { $set : {'updatedAt': Date.now()}, $addToSet : {'item': itemsArray} }, {upsert: true}, function(err, doc) {
                    if (err) return res.send(500, {error: err});
                    return;
                });

您应该使用$push:

var filter = { 'id': thisId };

User.findOneAndUpdate(filter, { 
   $set : { 'updatedAt': Date.now() }, 
   $push : { 'item': itemsArray } 
}, {upsert: true, new: true}, function(err, doc) {
   if (err) return res.send(500, {error: err});
   return;
});

使用
$addToSet
$each
更新数组,并使用
$set
更新其余字段。这可以在同一个查询中完成

在这种情况下,它将执行upsert操作,因为名称为raj的文档不存在


user = { _id: ObjectID("5ff171ce57fd21194c9f0d71"),
  name: 'ankit',
  item: [ 'apple', 'orange' ] }

db.user.findOneAndUpdate({name:'raj'},{$set:{age:13},$addToSet:{item:{$each:['apple','banana']}}},{upsert:true,new:true})
在这里,它将简单地更新包括数组字段在内的字段


user = { _id: ObjectID("5ff171ce57fd21194c9f0d71"),
  name: 'ankit',
  item: [ 'apple', 'orange' ] }

db.user.findOneAndUpdate({name:'ankit'},{$set:{age:1},$addToSet:{item:{$each:['apple','banana']}}},{upsert:true,new:true})

我认为使用
findOneAndUpdate()
尝试以下方法不是最好的:

const filter = { 'id': thisId };
const user = await User.findOne(filter);
user.items.push(...itemsArray) // If itemsArray is an array
await user.save();

不,我现在有机会正确地测试它,但它不工作。你能控制台.log(itemsArray)吗?第一次有400个字符串,第二次有50个。mongodb上第一次显示字段项的400个正确插入值,第二次显示50ok,所以你应该$push,我会编辑邮递员,我感觉你在这里尝试过。。push绝对不是这里需要的,事实上它只是每次在400的基础上增加50。关于顶部的第一个示例,如果我只有数组要更新,我会使用$addToSet,但我还有其他字段要更新/创建(通过upsert)。因此,我想在我的例子中,我不能将$addToSet应用于整个“update”变量,对吗?(这是一个字符串数组,顺便说一句)我是否应该进行两次单独的更新,一次仅使用$addToSet的数组,另一次使用其余字段?应该是这样吗?或者像
findOneAndUpdate(filter,{$set:{'item':itemsArray},update},{upsert:true},function(err,doc){
这样的东西可能吗?您可以在同一个查询中更新数组和其他字段。
User.findOneAndUpdate(filter,{$set:update,$addToSet:{item:itemObj},{upsert:true,new:true},function(err,doc){if(err)return res.send(500,{error:err});return;})
@m4tt请检查这是否解决了您的问题。如果您提供数据示例输入/输出,则有点不清楚。