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`似乎不起作用,可以吗?请告诉我