【问题标题】:MongoDB Exclude documents from the find result based on the values of a subdocumentMongoDB 根据子文档的值从查找结果中排除文档
【发布时间】:2017-09-18 14:47:59
【问题描述】:

我收集了一些产品。每个产品都包含一系列历史项目。

{
    "_id" : "product1"
    "name" : "Product 1",
    "history" : [
        {
                "date" : "2017-09-18 11:49:03.000",
                "processed" : 0,
                "status": "New"
        },
        {
                "date" : "2017-09-18 11:49:03.000",
                "processed" : 0,
                "diff": []
        }
    ]
}
{
    "_id" : "product2"
    "name" : "Product 2",
    "history" : [
        {
                "date" : "2017-09-18 11:49:03.000",
                "processed" : 1,
                "status": "New"
        },
        {
                "date" : "2017-09-18 11:49:03.000",
                "processed" : 0,
                "diff": []
        }
    ]
}

我可以使用以下 mongoDB 查询找到所有新产品和尚未处理的历史记录:

db.products.find(
    {
        "history": {
            $elemMatch: {
                "processed": {$eq: 0},
                "status": {$eq: "New"}
            }
        }
    }
)

但我不知道如何找到:

  • 它有一个需要处理的历史项目"processed": {$eq: 0}
  • 不包含状态为“新”且处理值为“0”的历史记录项

所以它应该带回“product2”而不是“product1”,因为 product1 需要以不同的方式处理。

非常感谢任何帮助:-)

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    您在输出中只得到product 1,因为您正在对仅匹配product 1processedstatus 字段进行and 搜索。如果您希望 product 2 也仅基于 processed 字段输入,那么您需要使用 $or 查询。

    检查以下查询,它将返回 product 1product 2

    {
         "history": {
             $elemMatch: {
                $or:[
                  {"processed": {$eq: 0}},
                  {"status": {$eq: "New"}}]
             }
         }
    }
    

    根据您在 cmets 中的解释更新了查询。

    .find({
        $and:[{
            "history": {
                $not: {
                    $elemMatch: {
                        "processed": {$eq: 0},
                        "status":{$eq: "New"}
                    }
                }
            }
        },
        {"history.processed":0}
    ]})
    

    【讨论】:

    • 感谢您的回答。我实际上需要两个查询(我想分别处理它们)一个只返回product1,我可以用我的问题中的查询来做,但我不知道如何在基于单独的查询中只返回product2事实上,它的状态 new 的历史记录项已被处理,但它还有另一个尚未处理的历史记录项。我也总是得到product1
    • 所以总是product 1product 2 或者你想要一些其他参数的查询。能否请您更详细地解释一下。
    • 集合中总共将有 1000 多个产品,它们是从单独的系统导入的。我将这些导入 mongo 并将更改作为历史项目进行跟踪。我希望能够通过两个不同的查询进行检索: - 第一个查询:状态为新的产品(我可以用我的问题中的查询来完成)(仅限产品 1) - 第二个查询:具有历史项目的产品需要导出处理=0,但没有需要导出的状态新历史项目(仅限产品 2)。所以我想找到已处理= 0 且没有状态=新的历史项目
    • none of those have status=new 表示history 数组中的任何项目?在您上面的示例中,两个产品在数组中都有一个具有 processed=0 的项目,并且它们都没有 status=new --- { "date" : "2017-09-18 11:49:03.000", "processed" : 0, "diff": [] } 这就是它同时返回 product 1product 2 的原因
    • 产品 2 具有“已处理”:1 和“状态”:“新”,而产品 1 具有“已处理”:0 和“状态”:“新”。在 mysql 中,我想它会类似于 Where history.processed = 0 AND NOT (history.processed = 0 AND history.status = 'new')
    猜你喜欢
    • 2014-05-10
    • 2013-09-30
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 2015-05-03
    相关资源
    最近更新 更多