Mongo仅匹配数组的第一个元素具有特定字段值的位置

时间:2017-09-29 08:29:54

标签: arrays mongodb

我在下面有一个查询,从大型嵌套文档中提取几个值。它告诉我用户ID和每个订单的第一个项目名称。

这样可以正常工作,但是我希望它只返回第一个项目的名称不为空且不为空的记录。我无法弄清楚如何在下面的$ match运算符中添加第二个查询来实现此

db.getCollection('Orders').aggregate
([
{ $match : { "Items.1" : { $exists : true }}, ???},
{ $project: { 
    _id:0, 
    'UserId': '$User.EntityId', 
    'ItemName': {$arrayElemAt: ['$Items.Details.ItemName', 0]}
   }
}
]);

编辑以显示示例文档

{
    "_id" : "order-666156",
    "State" : "ValidationFailed",
    "LastUpdated" : {
        "DateTime" : ISODate("2017-09-26T08:54:16.241Z"),
        "Ticks" : NumberLong(636420128562417375)
    },
    "SourceOrderId" : "666156",
    "User" : {
        "EntityId" : NumberLong(34450),
        "Name" : "Bill Baker",
        "Country" : "United States",
        "Region" : "North America",
        "CountryISOCode" : "US",
    },
    "Region" : null,
    "Currency" : null,
    "Items" : [ 
        {
            "ClientOrderId" : "18740113",
            "OrigClientOrderId" : "18740113",
            "Quantity" : NumberDecimal("7487.0"),
            "TransactDateTime" : {
                "DateTime" : Date(-62135596800000),
                "Ticks" : NumberLong(0)
            },
            "Text" : null,
            "LocateRequired" : false,
            "Details" : {
                "ItemName" : "Test Item 1",
                "ItemCost" : 1495.20
            }
        },
        {
            "ClientOrderId" : "18740116",
            "OrigClientOrderId" : "18740116",
            "Quantity" : NumberDecimal("241.0"),
            "TransactDateTime" : {
                "DateTime" : Date(-62135596800000),
                "Ticks" : NumberLong(0)
            },
            "Text" : null,
            "LocateRequired" : false,
            "Details" : {
                "ItemName" : "Test Item 2",
                "ItemCost" : 2152.64
            }
        }
    ]

}

1 个答案:

答案 0 :(得分:0)

您需要将两个条件添加到现有$ match(非空且不为空)以将项目检查为:

 $match : { "Items.1" : { $exists : true, "$ne": null,"$ne":""}

如果要检查元素Items [0] .Details.ItemName,您可以使用运算符$and

{ $match : { 
      $and: [ 
          {"Items.1" : { $exists : true }},
          {"Items.Details.ItemName" : { $ne : null}},
          {"Items.Details.ItemName" : { $ne : ""}},
      ]
    }},