mongoose MongoDB -删除唯一文档

gkn4icbw  于 2023-06-23  发布在  Go
关注(0)|答案(1)|浏览(84)

我需要删除具有字段值的唯一文档。我正在运行一个查询,以根据某些条件查找文档。下面是查询-

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来执行任务,但找不到解决方案。也许还有其他的办法。

8oomwypt

8oomwypt1#

我认为我们可以通过使用下面的查询来实现这一点:

db.collection.aggregate([
     // grouping based on itemId ;
  {
    $group: {
      _id: "$itemId",
      count: {
        $count: {}
      }
    }
  },
    //  remove those who have count < 2 (unique elements)
  {
    $match: {
      "count": {
        $gte: 2
      },
      
    }
  },
   // populate documents
  {
    $lookup: {
      from: "collection",
      localField: "_id",
      foreignField: "itemId",
      as: "fromItems"
    }
  },
   // level up 'fromItems'
  {
    $unwind: "$fromItems"
  },
  {
    $replaceRoot: {
      newRoot: "$fromItems"
    }
  }
])

上面的代码分三个阶段运行,
首先,我们对文档进行分组,以观察其中哪一个是唯一的。然后我们删除这些文件。
在第二阶段,我们有一个非唯一文档的集合,但是没有数据,只有它们的id,我们需要填充它们。所以,我们然后用它自己对它们执行join(使用$lookup)。
最后,我们只是将fromItems向上移动一级,有效地使其成为文档而不是嵌入文档。
你可以测试一下,看看它是否工作。

相关问题