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

如何在mongodb中找到给定数据集的单个作者的所有注释?

符正信
2023-03-14

假设我有一个博客数据集,看起来像

{
    "_id" : "abcde",
    "author" : "xyz",
    "body" : "this is test body",
    "date" : "xyz",
    "tags" : ["tag1","tag2"],
    "comments":[
        { "body": "comment1",
          "email": "email1",
          "author" :"author1"
        },       
        { "body": "comment2",
          "email": "email2",
          "author" :"author2"
        }   
       ]
}

在这里,每个文档代表一篇博客文章。每个博客帖子可以有多个评论,但只有一个我的一个用户。比如说,我必须找到某位作者的所有评论。对此有何疑问?

一种方法是释放评论,然后按comments.author分组,并推送comments.body。

然而,它可以做到没有聚合管道,只是通过使用查找?因为我认为我应该通过寻找来做到这一点。有人能帮我吗?

共有1个答案

司空丰
2023-03-14

可以使用点表示法对子文档数组进行查询。

您的查询看起来像这样:

db.blog_posts.find({"comments.author": "author1"});

这将返回包含author值为author1的子文档的所有文档。结果将是整个post文档,因此您可能需要指定要返回的字段。这称为查询投影。

db.blog_posts.find({“comments.author”:“author1});

要指定所需的字段,请向.find()函数添加一个额外的对象作为第二个参数:

db.blog_posts.find({"comments.author": "author1"}, {"comments": 1} );

现在,生成的文档将只包含_id字段和注释字段。

请记住,您实际上是在查询博客文章集合,所以您返回的结果仍然是博客文章——但只是指定作者发表评论的文章。

下一步只提取注释对象的简单方法可能如下所示:

var author = 'author1';
var comments = [];

db.blog_posts.find(...).forEach(function(doc){
  var post_comments = doc.comments;
  for (var i=0; i<post_comments.length; i++){
    if (post_comments[i].author ==  author){
      comments.push(post_comments[i]);
    }
  }
});

以下是相关文档页面:

http://docs.mongodb.org/manual/tutorial/query-documents/#array-of-embedded-documents

在不指定数组索引的情况下匹配字段
如果不知道文档在数组中的索引位置,请将包含数组的字段名称与点(.)和嵌入文档中的字段名称连接起来。

 类似资料:
  • 这里是我尝试的代码,我成功地获得了所有集合的名称,但当我搜索特定的字段时,它不起作用,也没有给我任何错误。 该代码没有错误,也没有警告。

  • 问题内容: 如何去尝试找到Java中给定类的所有子类(或给定接口的所有实现者)?到目前为止,我有一种方法可以执行此操作,但是我发现它效率很低(至少可以这样说)。方法是: 获取类路径上存在的所有类名称的列表 加载每个类并测试以查看它是否是所需类或接口的子类或实现者 在Eclipse中,有一个很好的功能,称为类型层次结构(Type Hierarchy),可以很有效地显示它。如何进行编程? 问题答案:

  • 问题内容: 我为方法提供了一个简单的标记注释(类似于 有效Java (第2版)第35条中的第一个示例): 然后,在给定的包(例如)中,它有一些包含20个类的子包,我想找到所有带有注释的方法。(因为我想对单元测试中所有带注释的方法进行一些检查。) 最简单的方法是什么?最好不要添加新的第三方库或框架。 编辑 :进行澄清,显然将是检查方法是否具有注释的方法- 但此问题包括查找所有方法。 问题答案: 如果

  • 我创建了一个MongoDB自动分片集群,其中包含3个分片服务器(无复制),1个配置服务器和1个Mongos实例。 下面是 sh.status() 输出。 虽然这里的块数量很大,但所有数据都只存储在一个分片中。平衡器状态为“活动”,但它不是一直运行。一旦它只运行了5-10秒。它显示如下错误, 任何人都可以帮我解决它吗?我是MongoDB的新手,希望通过创建分片集群来学习和测试MongoDB的可扩展性

  • 出身背景我有数字1到20(黑色背景上的白色数字),可以出现在屏幕上,我希望识别这些数字。由于它们不能简单地复制粘贴,我将比较屏幕上数字的白色像素位置与所有20个数字的白色像素位置列表。然而,每个数字可以有大量的像素,并且可能不需要比较所有这些像素来识别该数字。因此,我希望尽可能少地进行比较。 算法问题:我有多个集合,其中的元素在每个集合中是唯一的,但在所有集合中可能不是唯一的。如何找到每个集合的最

  • 我有这个spring配置: 如何获取用Foo注释的所有bean的列表? 注意: