MongoDB根据子文档

时间:2017-09-18 14:47:59

标签: mongodb mongodb-query

我有产品系列。每个产品都包含一系列历史记录项。

{
    "_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需要以不同的方式处理。

非常感谢任何帮助: - )

1 个答案:

答案 0 :(得分:0)

您的输出中只有product 1,因为您正在and搜索仅匹配processed的{​​{1}}和status字段。如果您希望product 1仅基于product 2字段,则需要使用processed查询。

检查以下查询,它将同时返回$orproduct 1

product 2

根据您在评论中的说明更新了查询。

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