当前位置: 首页 > 知识库问答 >
问题:

如何在mongoDB中分组并返回结果中的所有字段

冉德元
2023-03-14

我在mongoDB中使用聚合方法进行分组,但当我使用$group时,它返回我用于分组的唯一字段。我试过$project,但它也不起作用。我还尝试了$first,它成功了,但结果数据现在的格式不同了。

我需要的响应格式如下:

{
    "_id" : ObjectId("5b814b2852d47e00514d6a09"),
    "tags" : [],
    "name" : "name here",
    "rating" : "123456789"
}

在我的查询中添加$group之后。响应是这样的,_id的值会发生变化。(而且$group只接受_id,如果我尝试任何其他关键字,它会抛出一个累加器错误。请解释一下。)

{
    "_id" :"name here" //the value of _id changed to the name field which i used in $group condition
}

我必须删除名称字段中的重复项,而不改变任何结构和字段。此外,我正在使用猫鼬的nodeJS,所以请提供使用它的解决方案。

共有3个答案

裴弘
2023-03-14

当您在任何数据库上对数据进行分组时,这意味着您希望在所需字段上执行累积操作,而不包括在累积操作中的其他字段将用于分组

 db.collection.aggregate([{
 $group: {
   _id: { field1: "", field1: "" },
   acc: { $sum: 1 }
 }}]

在这里_id对象将包含您想要保存的所有其他字段。

对于你的数据,你可以试试这个

db.collection.aggregate([{
    $group: {
        _id: "$name",
        rating: { $first: "$rating" },
        tags: { $first: "$tag" },
        docid: { $first: "$_id" }
    }
},
{
    $project: {
        _id: "$docid",
        name: "$_id",
        rating: 1,
        tags: 1
    }
}])
容宏逸
2023-03-14

user2683814的解决方案对我很有效,但在我的例子中,当我们替换newRoot对象时,我有一个计数器累加器,计数字段在最后阶段丢失,所以我使用了$mergeObjects操作符来取回我的计数字段。

db.collection.aggregate([
 {
  $group: {
    _id: '$product',
    detail: { $first: '$$ROOT' },
    count: {
      $sum: 1,
    },
  },
},
{
  $replaceRoot: {
    newRoot: { $mergeObjects: [{ count: '$count' }, '$detail'] },
  },
}])
蓟和煦
2023-03-14

可以使用下面的聚合查询。

$$ROOT按每个名称保留整个文档,后跟$replaceRoot将文档提升到顶部。

db.col.aggregate([
  {"$group":{"_id":"$name","doc":{"$first":"$$ROOT"}}},
  {"$replaceRoot":{"newRoot":"$doc"}}
])
 类似资料:
  • 我正在尝试从下面的查询收集表格中获取数据: 但如果$match的集合中存在datat,则会导致空数据,但此slug的job\u活动不存在 有人能帮忙吗谢谢

  • 问题内容: 在我的AJAX调用中,我想将字符串值返回到调用页面。 我应该使用还是返回一个字符串? 问题答案: 您可以使用返回一个纯字符串: 默认情况下返回a 作为其contentType。这是可重载的,因此您还可以执行以下操作:

  • 我试图从一个网站刮数据练习网络刮。但是返回空集。我如何解决这个问题? 输出:

  • 我正在创建,比如说,15个Callable任务,并提交它们: 然后我收集15个MyResult对象: 问题是:我没有从get()方法获得所有15个MyResult对象,而是有时获得不到15个对象。有时12有时10有时甚至更少,有时全部15。 我的印象是,方法是一个阻塞调用,将等待所有15个线程返回各自的结果,但看起来我错过了其中的一些线程并继续前进。我做错了什么?我是否未正确收集结果/等待结果?当

  • 问题内容: 我被困在这里。我在Postgres中有这样的行: sql语法如何获得这样的结果? 问题答案:

  • 我对promise不熟悉。我查找了按顺序执行promise的示例,但没有找到与我的应用程序类似的示例。 我的问题是,我想按照一定的顺序解决promise,但也要捕获promise解决时的所有结果。通过查找例子。我已经创建了这个问题的简化版本。 我能够创建一个函数doWork(),但问题是它所做的只是按顺序解决promise,而没有捕获结果。 理想情况下,我想要一个返回promise的函数,该函数将