mongodb 在节点中使用 mongoose 想要在查询中使用 or 和

Posted

技术标签:

【中文标题】mongodb 在节点中使用 mongoose 想要在查询中使用 or 和【英文标题】:mongo using mongoose in node want to use or and in query 【发布时间】:2020-02-08 00:09:01 【问题描述】:

我有一种情况,我必须检查公司名称和公司代码,如果两者都与现有匹配,而不是应该说存在,或者如果其中一个在现有数据库中匹配,那么它也应该说存在。 我将如何在 mongo 中使用? 因此,如果数据接收 isDeleted 为真,我还想在 if 部分中添加检查是否不添加而不是检查 id 和更新,我也想通过 isDelete,这样如果收到的任何数据之前被删除,那么它可以再次设置为false。 我将如何处理这种删除场景?


    "userId":"tt838984984s",
  "company":
  "addressee" : 
      "addressee" : "Ms.1", 
      "title_name" : "", 
      "salutation" : "Drks:", 
      "comments" : "", 
      "email" : "opus7ent@example.com", 
      "phone" : "123456666", 
      "fax" : "", 
      "extention_group" : "", 
      "ext" : ""
  , 
  "abbreviation" : "", 
  "care_of" : "", 
  "address_1" : "HELLO2",
  "address_2" : "", 
  "address_3" : "", 
  "state" : "CA", 
  "zip" : "90024", 
  "is_deleted" : true, 
  "company_code" : "ABACAB", 
  "parent_company" : null, 
  "name" : "Abacab", 
  "createdBy" : "Data lolz", 
  "modifiedBy" : "Data", 
  "createdDate" : "2019-08-22T19:10:50.000+0000", 
  "modifiedDate" : "2019-08-22T19:10:50.000+0000", 
  "company_id_legacy" :1246, 
  "__v" : 0, 
  "is_registered_for" : false,

,



  is_deleted == false
    if(!isAdd) 
          filter["_id"] = "$ne" : id;
           
        let filter = 
                 name:  $regex: new RegExp(`^$company.name$`, 'i') ,
                 company_code:  $regex: new RegExp(`^$company.company_code$`, 'i') 
    
    cModel.find(filter, function (err, docs) 
                            if (docs.length) 
                                result.error = "Name already exists: " + company.name;
                                console.log("Name already exists", null);
                                let resp = api_respose.getSuccessResponse(process.env.WEB_URI, result.error);
                                resolve(resp);
                            
    else
     ///saving here
    

现在假设我传递了那个 JSON,如果有 is_deleted = false(这是在 db 中添加新条目时的 Json) 现在,如果在带有 namecompany_code 的数据库中存在一些带有 is_delete =true 的旧条目,那么它会抛出 name 已经存在的错误

现在我的问题是如何解决这种情况?就像我想用新条目覆盖那个文件一样,还是有其他方法可以做到这一点?

【问题讨论】:

【参考方案1】:

如果我理解正确的话,你需要在 Mongodb 或 mongoose 中的 $and 函数中使用 $or,它们都支持这两个函数。例如(在猫鼬中):

cModel.find(
        
            $and: [
                
                    $or: [
                         name:  $regex: new RegExp(`^$company.name$`, 'i')  ,
                         company_code:  $regex: new RegExp(`^$company.company_code$`, 'i')  
                    ]
                ,
                
                    is_delete: true
                
            ]
        , function (err, docs)  
            if(docs)
                // throw error!
             if (!docs) 
                // enter your new doc here with cModel.create(yourDoc, function(error, data));
            
        
    );

此函数的完整文档在这里:

https://docs.mongodb.com/manual/reference/operator/query/and/

【讨论】:

我已经用删除场景更新了这个问题,看看你能不能帮忙? 抱歉,我不明白你到底想要什么。你能解释一下吗?我很乐意帮助你。谢谢。 用 JSON 和解释更新了问题 当我更新相同的 JSON 传递 _id 时使用此代码,当我保留已在 db 中退出的名称时,它允许创建,而不是抛出名称已退出的错误 首先要检查这样的文件是否存在,如果不存在,则可以插入。通过我上面写的查询,你可以知道它是否存在。【参考方案2】:

你可以使用$或运算符

  let filter = 
     "$or":[
             name:  $regex: new RegExp(`^$company.name$`, 'i') ,
             company_code:  $regex: new RegExp(`^$company.company_code$`, 'i') 
            ]


cModel.find(filter, function (err, docs) 
                        if (docs.length) 
                            result.error = "Name already exists: " + company.name;
                            console.log("Name already exists", null);
                            let resp = api_respose.getSuccessResponse(process.env.WEB_URI, result.error);
                            resolve(resp);
                        
else
 ///saving here

更多信息请参考https://docs.mongodb.com/manual/reference/operator/query/or/

【讨论】:

我已经用删除场景更新了这个问题,看看你能不能帮忙?

以上是关于mongodb 在节点中使用 mongoose 想要在查询中使用 or 和的主要内容,如果未能解决你的问题,请参考以下文章

mongodb 在节点中使用 mongoose 想要在查询中使用 or 和

MongoDB/Mongoose 一对多,在子节点中引用父节点 - 分组并加入

如何使用 Mongodb 或 Mongoose 查询并使用 javascript 打印?

在节点应用程序上使用 mongoose 的远程 mongo 身份验证问题

在节点应用程序上使用 mongoose 的远程 mongo 身份验证问题

我无法使用 Mongoose 在 MongoDB 中保存或查找文档