【问题标题】:MongoDB query - find one of each from tag arrayMongoDB 查询 - 从标签数组中查找每个
【发布时间】:2012-05-14 12:17:42
【问题描述】:

我正在尝试在 MongoDB/Mongoose 中执行“where $in”查询,其中我只想为数组中的每个标记返回一个结果。有点像:

db.images.find( { hashtag : { $in : ['tag1', 'tag2', 'tag3'] } } );

我会得到三个独特的结果;每个都来自我指定的一组标签。

[{name:'image1', hashtag:'tag1'},
{name:'image55', hashtag:'tag2'},
{name:'image99', hashtag:'tag3'}]

在 SQL 中,您会使用 GROUP BY 之类的东西,但如果不执行 Map/Reduce,我无法在 MongoDB 中找到等效项。

无论如何要这样做?谢谢。

--编辑 我想要的等效 SQL 是:

SELECT * FROM images WHERE hashtag in ('tag1', 'tag2', 'tag3') GROUP BY hashtag;

或者理想情况下,虽然 MongoDB 没有随机数

SELECT * FROM images WHERE hashtag in ('tag1', 'tag2', 'tag3') GROUP BY hashtag ORDER BY rand();

【问题讨论】:

  • 您能说明一下您的文档是什么样的吗?它是名称和主题标签数组吗?我实际上并没有看到 SQL group by 在这里会为您做什么 - 看起来您想要任何带有 tag1 的单个图像名称、带有 tag2 的任何图像名称以及带有 tag3 的任何图像名称?我什至不确定这是否可以在您的应用程序中轻松解决,更不用说在查询中...
  • 不,我的文档实际上并非如此。这只是我想要完成的一个例子。
  • SQL 很简单:SELECT * FROM images WHERE hashtag in ('tag1', 'tag2', 'tag3') GROUP BY hashtag;
  • relational 没有主题标签数组,所以我仍然不明白您的 SQL 示例。您是否假设 SQL 将为每个名称/标签对有一行?这将在带有聚合框架的 2.2 中提供,您可以在其中展开数组,但您仍然必须解决如何保证每个名称和每个主题标签都没有重复的问题。
  • 我没有说“hashtag”是一个数组。在本例中,它被用作字符串字段。

标签: mongodb mongoose mongodb-query


【解决方案1】:

听起来您正在等待 MongoDB 的 2.2 版本,其中包含一个聚合管道,可让您将数组展开为多个结果。

http://www.mongodb.org/display/DOCS/Aggregation

【讨论】:

【解决方案2】:

我在 2.0 中找不到这样做的方法,但在 2.2 中(目前作为开发版本 2.1.1 提供 - 仅可用于测试但生产)aggregation framework 将允许您这样做(仅作为示例,我确信其他方式也是可能的):

  db.images.aggregate( 
       {$match   : {hashtag: {$in:["tag1","tag2"]}}}, 
       {$group   : {_id:"$hashtag", name: {$first:"$name"}}},
       {$project : {hashtag:"$_id", name: "$name", _id:0}}
  )

返回:

{
         "result" : [
        {
            "hashtag" : "tag2",
            "name" : "1"
        },
        {
            "hashtag" : "tag1",
            "name" : "1"
        }
    ],
    "ok" : 1
  }

这是假设您的文档格式为 {name:"xxx",hashtag:"tagX") 并且许多名称对应于每个主题标签。聚合管道所做的是使用 $match 将工作集限制为标签为“tag1”或“tag2”的工作集,然后我们按标签分组并指定我们只想保留每个分组的 $first 结果($最后一个是另一种选择) - 这假设您不在乎返回哪个名称,只要它只是一个。 $project 用于将需要哪个组的 _id 映射回字段名称“hashtag”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多