我需要删除具有字段值的唯一文档。我正在运行一个查询,以根据某些条件查找文档。下面是查询-
db.contents.aggregate([
{
$match: {
$or: [
{
$and: [
{ widgetId: new ObjectId("648d461dae1b9fb2af57fbb2") },
{ value: 'Yes' }
]
},
{
$and: [
{ widgetId: new ObjectId("648d4111ae1b9fb2af57f8f9") },
{
value: "20"
}
]
}
]
}
}
])
运行查询后,我从contents
集合中得到以下文档-
[{
_id: ObjectId("648d50d3221f77c425aac162"),
label: 'Featured Product',
itemId: ObjectId("648d50d3221f77c425aac146"),
slug: 'featured-product',
value: 'Yes',
widgetId: ObjectId("648d461dae1b9fb2af57fbb2")
}
{
_id: ObjectId("648d5131221f77c425aac1b9"),
label: 'Featured Product',
itemId: ObjectId("648d5131221f77c425aac1b0"),
slug: 'featured-product',
value: 'Yes',
widgetId: ObjectId("648d461dae1b9fb2af57fbb2")
}
{
_id: ObjectId("648d5199221f77c425aac223"),
label: 'Featured Product',
itemId: ObjectId("648d5199221f77c425aac21a"),
slug: 'featured-product',
value: 'Yes',
widgetId: ObjectId("648d461dae1b9fb2af57fbb2")
}
{
_id: ObjectId("648d51d1221f77c425aac28b"),
label: 'Discount',
itemId: ObjectId("648d51d1221f77c425aac284"),
slug: 'discount',
value: '20',
widgetId: ObjectId("648d4111ae1b9fb2af57f8f9")
}
{
_id: ObjectId("648d51d1221f77c425aac28d"),
label: 'Featured Product',
itemId: ObjectId("648d51d1221f77c425aac284"),
slug: 'featured-product',
value: 'Yes',
widgetId: ObjectId("648d461dae1b9fb2af57fbb2")
}]
现在,在同一个查询中,我需要删除所有具有唯一itemId
的文档。所以,结果输出应该是-
[{
_id: ObjectId("648d51d1221f77c425aac28b"),
label: 'Discount',
itemId: ObjectId("648d51d1221f77c425aac284"),
slug: 'discount',
value: '20',
widgetId: ObjectId("648d4111ae1b9fb2af57f8f9")
}
{
_id: ObjectId("648d51d1221f77c425aac28d"),
label: 'Featured Product',
itemId: ObjectId("648d51d1221f77c425aac284"),
slug: 'featured-product',
value: 'Yes',
widgetId: ObjectId("648d461dae1b9fb2af57fbb2")
}]
我想,我需要应用filter
来执行任务,但找不到解决方案。也许还有其他的办法。
1条答案
按热度按时间8oomwypt1#
我认为我们可以通过使用下面的查询来实现这一点:
上面的代码分三个阶段运行,
首先,我们对文档进行分组,以观察其中哪一个是唯一的。然后我们删除这些文件。
在第二阶段,我们有一个非唯一文档的集合,但是没有数据,只有它们的id,我们需要填充它们。所以,我们然后用它自己对它们执行join(使用
$lookup
)。最后,我们只是将
fromItems
向上移动一级,有效地使其成为文档而不是嵌入文档。你可以测试一下,看看它是否工作。