0

我正在尝试在 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 中找到等价物。

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

--edit 我想要的等效 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();
4

2 回答 2

0

我找不到在 2.0 中执行此操作的方法,但在 2.2(当前可作为开发版本 2.1.1 - 仅可用于测试但不可用于生产)中,聚合框架将允许您这样做(仅作为示例,我确信其他方式是可能的):

  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”。

于 2012-05-06T23:45:36.510 回答
0

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

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

于 2012-05-05T00:18:53.100 回答