MongoDB将文档与嵌套数组中的元素进行匹配

MongoDB将文档与嵌套数组中的元素进行匹配,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个如下的集合,目标是删除与其items.fruits.color和items.fruits.type匹配的每个文档 问题是,我需要找到同时具备这两种条件的水果 另外,如果items键为空,我需要选择该文档 这是我的聚合状态: { type: "x" color: "red" items => [ { item_id: 6 fruits: [

我有一个如下的集合,目标是删除与其
items.fruits.color
items.fruits.type匹配的每个文档
问题是,我需要找到同时具备这两种条件的水果

另外,如果
items
键为空,我需要选择该文档

这是我的聚合状态:

{
    type: "x"
    color: "red"
    items => [
        {
          item_id: 6   
          fruits: [
                {
                    color: "red",
                    type: "x"
                },
                {
                    color: "red",
                    type: "y"
                }
            ]
        },
        {
            item_id: 7   
            fruits: [
                {
                    color: "orange",
                    ref_id: "h"
                },
                {
                    color: "green",
                    ref_id: "x"
                }
            ]
        }
     ]
},{
    
    type: "o"
    color: "red"
    items => []

},{
    
    type: "w"
    color: "red"
    items => [
        {
            fruits: [
                {
                    type: "w",
                    color: "black"
                }
            ]
        }
    ]
}
因此,第一个文档无效,因为
items[fruits][0]
的属性完全匹配

但是第二个是有效的,因为items数组是空的

第三个也是有效的,因为它的物品里面没有匹配的水果

我尝试的最后一个查询是:

$match: {
   "items.fruits": {
      $not: {
          $elemMatch: {
              color: "$color",
              type: "$type"
          }
      }
  }
}

但它不起作用。而是显示所有文档。(我认为这是因为$color语句未被识别为变量)

如果要在没有给定颜色和类型的水果的任何文档上进行匹配,应该这样做:

[{$match: {
   "items.fruits": {
      $not: {
          $elemMatch: {
              color: "red",
              type: "x"
          }
      }
  }
}}]

我已经朝另一个方向走了。我认为这将使您开始,您可以添加其他$project或$group阶段,以获得所需格式的最终结果

[
{$unwind: {
  path: "$items"
}}, 
{$unwind: {
  path: "$items.fruits"
}}, 
{$addFields: {
  "items.fruits.isAMatch": 
    { $and: [
      {$eq: ["$items.fruits.type", "$type"] },
      {$eq: ["$items.fruits.color", "$color"] }
      ]
    }
}}, 
{$group: {
  _id: 
    {"id": "$_id",
    "itemid": "$items.item_id"
  },
  type: {$first: "$type"},
  color: {$first: "$color"},
  fruits: { $push: "$items.fruits" }
}}, {}]

第一阶段展开items数组。第二阶段展开水果数组。第三阶段检查水果和颜色是否匹配,并创建一个名为
isAMatch
的新字段来指示它们是否匹配。最后一个阶段根据_id和items.item_id将文档重新分组。文档与原始文档相似,但它们在水果数组对象中添加了字段,指示它们是否匹配。

点表示法透明地遍历数组。添加到目前为止您尝试过的查询及其产生的结果。不幸的是,没有。此阶段将搜索水果并找到一个颜色相同的水果,然后再次搜索所有水果并找到另一个(或可能相同)类型相同的水果。但我需要一个阶段来搜索水果,找到一个完全相同类型和颜色的水果。不是两种不同的水果。问题就从这里开始:(我想我理解你的意思。我编辑了上面的答案以反映这一点。你能告诉我如何用颜色属性的值替换“红色”吗?`color:$color`似乎不起作用,可以吗?请告诉我