MongoDB查询 - 从标记数组中查找每个查询

时间:2012-05-04 23:54:03

标签: mongodb mongoose mongodb-query

我正在尝试在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();

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我无法在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将工作集限制为hashtag为“tag1”或“tag2”的那些,然后我们按hashtag分组并指定我们只想保留每个分组的$ first结果($最后是另一种选择) - 这假设你不关心你得到的名字,只要它只是一个。 $ project用于映射_id哪个组需要返回字段名称“hashtag”。