当我需要用和子句分隔查询时,在猫鼬中有两个“或”子句[重复]

Posted

技术标签:

【中文标题】当我需要用和子句分隔查询时,在猫鼬中有两个“或”子句[重复]【英文标题】:having two "or" clauses in mongoose when I need to separate the query with an and clause [duplicate] 【发布时间】:2015-03-03 13:33:33 【问题描述】:

我想在 mongo 中查询“我创建或收藏的未过期或常青(过期的帖子)帖子”

我的查询的问题是 mongoose 将 or 语句组合在一起,因此我错误地得到 (unexpired or evergreen or mine or bookmarked) 而不是 ( (unexpired or evergreen) and (mine or bookmarked) )

如何将猫鼬查询更改为我上面概述的后一种正确情况。我应该使用“and”子句...还是应该只做一个 not(expiration > now) ?

var query =
      Invite.find( isActive:true )
        .or([
           'expiration': $gt: new Date() ,
           'expiration' : null 
        ])
        .or([
         createdBy:userId ,
         'bookmarked.id' : userId 
      ])

【问题讨论】:

【参考方案1】:

您可以使用 Query#and 帮助器将两个 $or 子句放入一个 $and 中:

var query =
  Invite.find( isActive:true )
    .and([
      $or: [
         'expiration': $gt: new Date() ,
         'expiration': null 
      ],
      $or: [
         'createdBy': userId ,
         'bookmarked.id' : userId 
      ]
    ])

【讨论】:

【参考方案2】:

这是我认为“帮助”方法并没有太大帮助的地方,因为它们会混淆问题。 javascript 是一种动态类型语言,因此您不需要这些辅助方法来定义构成查询的数据结构。 MongoDB 的所有本机运算符都在单个查询路径中被接受:

Invite.find(
    
        "isActive": true,
        "$and": [
             "$or": [
                 "expiration": null ,
                 "expiration":  "$gt": new Date()  
            ],
             "$or": [
                 "createdBy": userId 
                 "bookmarked.id": userId 
            ]
        ]
    ,
    function(err,result) 

    
);

【讨论】:

以上是关于当我需要用和子句分隔查询时,在猫鼬中有两个“或”子句[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在猫鼬中填充另一个模型的子文档?

如何在猫鼬中查询多个集合

如何在猫鼬中找到最新的子文档

如何使用猫鼬需要验证在猫鼬中插入多个文档?

在猫鼬中使用 $near 查询明智地获取数据位置时出错

在猫鼬中删除子文档