查找并更新数组中列出的许多文档

Posted

技术标签:

【中文标题】查找并更新数组中列出的许多文档【英文标题】:Find and update many documents listed in an array 【发布时间】:2019-07-04 00:31:41 【问题描述】:

我正在尝试通过查找数组中列出的所有匹配文档来更新我的数据库,然后更新列出的多个文档,我能够使用 findOne() 更新单个文档但是当我使用 @987654322 @ 查找数组中匹配的所有文档。它不会更新。有什么解决办法吗?

示例文件:

_id:5c5ef16221a4961b68e64d98
serial_code:"one"
status:"available"

_id:5c5ef17541a4961b68e64d98
serial_code:"two"
status:"available"

我的代码:

Bloodstock.find( serial_code :  $in : ['one','two','three']  , function(bloodstock)                                                
    bloodstock.status = 'not available';                            
    bloodstock.save(function(err) 
        if (err) 
            console.log(err); 
         else 
            console.log('success'); 
        
    );  
);

给我错误:

TypeError: bloodstock.save is not a function

【问题讨论】:

处理回调中的错误 bloodstock 是一个数组而不是一个对象。您必须遍历bloodstock,然后需要一一保存。 【参考方案1】:

您可以使用带有选项 multi: true 的 update 方法来更新与您的查询匹配的多个文档。

Bloodstock.update(
   serial_code :  $in : ['one','two','three']  ,
   $set:  status: 'not available' , 
   multi: true ,
  function (err, result)
    console.log(result)
  
);

您可以在此处查看有关选项的更多详细信息:https://docs.mongodb.com/manual/reference/method/db.collection.update/

【讨论】:

【参考方案2】:

Mongoose 的回调通常采用两个参数,第一个参数代表错误,请看here。因此,您的代码可能如下所示:

Bloodstock.find( serial_code :  $in : ['one','two','three']  , function(error, bloodstockDocs)                                                
    if(error) return;
    for(let bloodstock of bloodstockDocs) 
        bloodstock.status = 'not available';                            
        bloodstock.save(function(err) 
            if (err) 
                console.log(err); 
             else 
                console.log('success'); 
            
        );
      
);

编辑:find 返回一个集合,因此您需要使用for 循环遍历这些文档。

【讨论】:

仍然给我 TypeError: bloodstock.save is not a function @JeremyAdriandeVera 修改了我的答案【参考方案3】:

改用更新查询

Bloodstock.update(
   serial_code :  $in : ['one','two','three']  ,
   $set:  status: 'not available' , 
   multi: true ,
  function (err, result)
    console.log(result)
  
)

【讨论】:

以上是关于查找并更新数组中列出的许多文档的主要内容,如果未能解决你的问题,请参考以下文章

按子文档 ID 查找并更新其数据

MongoDB命令查找单个文档并在更新中有条件语句

如何在 MongoDB 中查找文档、更新文档并插入新文档?

如何在 MongoDB 中查找文档、更新文档并插入新文档?

查找在具有许多值的平面数组中完全表示的数组

从数组中查找并返回第一个匹配的子文档(Meteor / Mongo)