草庐IT

javascript - 匹配所有数组成员都不包含值的文档

coder 2023-10-29 原文

MongoDB 选择器很快变得复杂,尤其是当您来自 mySQL 使用 JOIN 和其他花哨的关键字时。我尽了最大努力使这个问题的标题尽可能清楚,但惨遭失败。

例如,让 MongoDB 集合的文档具有以下架构:

{
    _id : int
    products : [
        {
            qte : int
            status : string
        },            
        {
            qte : int
            status : string
        },
        {
            qte : int
            status : string
        },
        ...
    ]
}

我正在尝试运行 db.collection.find({ }) 查询返回文档,其中所有产品没有字符串“完成”作为状态。请注意,products 数组的长度是可变的。

我们也可以说我们想要所有文档至少有一个状态不是“完成”的产品。

如果我将其作为 Javascript 循环运行,我们将得到如下内容:

// Will contain queried documents
var matches = new Array();

// The documents variable contains all documents of the collection
for (var i = 0, len = documents.length; i < len; i++) {
    var match = false;

    if (documents[i].products && documents[i].products.length !== 0) {
        for (var j = 0; j < documents[i].products; j++) {
            if (documents[i].products[j].status !== "finished") {
                match = true;
                break;
            }
        }
    } 

    if (match) {
        matches.push(documents[i]);
    }
}

// The previous snippet was coded directly in the Stack Overflow textarea; I might have done nasty typos.

matches 数组将包含我要查找的文档。现在,我希望有一种方法可以做类似于 collection.find({"products.$.status": {"$ne":"finished"}}) 的事情,但是 MongoDB 讨厌我的当我这样做时面对。

此外,需要忽略没有任何产品的文档,但我已经用 $and 子句解决了这个问题。请注意,我需要返回ENTIRE 文档,而不仅仅是产品数组。如果文档中包含未“完成”的产品,则应显示整个文档。如果文档的所有产品都设置为“已完成”,则根本不会返回该文档。

MongoDB 版本:3.2.4

示例

假设我们有一个包含三个文档的集合。

这个会匹配,因为状态之一不是“完成”。

{
    _id : 1,
    products : [
        {
            qte : 10,
            status : "finished"
        },
        {
            qte : 21,
            status : "ongoing"
        },
    ]
}

这不会匹配,因为所有状态都设置为“完成”

{
    _id : 2,
    products : [
        {
            qte : 35,
            status : "finished"
        },
        {
            qte : 210,
            status : "finished"
        },
        {
            qte : 2,
            status : "finished"
        },
    ]
}

这也不匹配,因为没有产品。如果 products 字段未定义,它也不会匹配。

{
    _id : 3,
    products : []
}

同样,如果我们在包含本例中的三个文档的集合中运行查询,输出将是:

[
    {
        _id : 1,
        products : [
            {
                qte : 10,
                status : "finished"
            },
            {
                qte : 21,
                status : "ongoing"
            },
        ]
    }
]

只有第一个文档被返回,因为它至少有一个产品的状态不是“已完成”,但最后两个没有成功,因为它们的所有产品状态都设置为“已完成” ",或者根本没有任何产品。

最佳答案

尝试以下查询。它正在获取状态不等于 "finished"

的文档

Note: This query will work with MongoDB 3.2+ only

db.collection.aggregate([
    {
      $project:{
        "projectid" : 1,
        "campname" : 1,
        "campstatus" : 1,
        "clientid" : 1,
        "paymentreq" : 1,
        products:{
          $filter:{
            input:"$products", 
            as: "product", 
            cond:{$ne: ["$$product.status", "finished"]}
           }
        }
      }
    },
    {
      $match:{"products":{$gt: [0, {$size:"products"}]}}
    }
])

关于javascript - 匹配所有数组成员都不包含值的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36298596/

有关javascript - 匹配所有数组成员都不包含值的文档的更多相关文章

  1. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  2. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  3. ruby - 匹配未转义的平衡定界符对 - 2

    如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。

  4. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  5. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  6. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  7. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  8. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  9. ruby - rbenv 安装 ruby​​ 校验和不匹配 osx - 2

    我已经在mountainlion上成功安装了rbenv和ruby​​build。运行rbenvinstall1.9.3-p392结束于:校验和不匹配:ruby-1.9.3-p392.tar.gz(文件已损坏)预期f689a7b61379f83cbbed3c7077d83859,得到1cfc2ff433dbe80f8ff1a9dba2fd5636它正在下载的文件看起来没问题,如果我使用curl手动下载文件,我会得到同样不正确的校验和。有没有人遇到过这个?他们是如何解决的? 最佳答案 tl:博士;使用浏览器从http://ftp.rub

  10. ruby - 正则表达式将非英文字母匹配为非单词字符 - 2

    @raw_array[i]=~/[\W]/非常简单的正则表达式。当我用一些非拉丁字母(具体来说是俄语)尝试时,条件是错误的。我能用它做什么? 最佳答案 @raw_array[i]=~/[\p{L}]/使用西里尔字符进行测试。引用:http://www.regular-expressions.info/unicode.html#prop 关于ruby-正则表达式将非英文字母匹配为非单词字符,我们在StackOverflow上找到一个类似的问题: https://

随机推荐