【问题标题】:Mongodb: Querying array elements within a documentMongodb:查询文档中的数组元素
【发布时间】:2011-10-07 21:05:55
【问题描述】:

我有一个收藏要查询如下:

  • 归还所有文件
  • 最多 2 cmets(例如,切片,0、1 或 2 cmets)
  • 所有 cmets 的视图必须 > 10

似乎我需要创建一个函数来单独评估每个文档,但不清楚这是如何完成的,特别是考虑到我想做一个切片并返回最多 n 个符合该条件的项目。

示例架构:

{
    title: "One",
    comments: [
        {
            title: "comment1",
            views: 9
        },
        {
            title: "comment2",
            views: 10
        },
        {
            title: "comment3",
            views: 11
        },
        {
            title: "comment4",
            views: 12
        },
    ]
}

我想做这样的事情:

db.collection.find({"comments.views": {$gt: 10}}, {comments:{$slice: 2}})

但这会返回任何带有 > 10 个视图的评论的文档,然后切片 2 个 cmets...我想返回那些有 > 10 个项目的 cmets。我不能在客户端上做它并且使用 $slice 而不丢失一些 cmets,所以我需要在数据库上做它。想法?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    但这会返回任何带有> 10个视图的评论的文档,然后 切片 2 cmets

    这是过滤多级嵌入文档的行为,通常匹配过滤器会返回整个文档,而不是子集。

    通常位置运算符 $ 用于匹配更新中的子文档。但该功能尚未在返回说明符中实现。

    mongo Support for positional ($) operator in fields to return specifier 中已经存在一个悬而未决的问题。 (如果您确实需要该功能,请登录投票)

    所以你必须处理

    • 最多 2 cmets(例如,切片,0、1 或 2 cmets)

    通过循环遍历所有集合加入您的应用程序。

    【讨论】:

      【解决方案2】:

      你可以看看聚合。你必须先 $unwind 它,然后应用过滤器:

      db.<your collection>.aggregate( [ { $unwind : "$comments" }, 
          {$match:{"comments.views": {$gt: 10}}} ] )
      

      检查结果并对其应用其他操作

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多