我正在尝试在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();
答案 0 :(得分:0)
听起来好像您正在等待MongoDB的2.2版本,它将包含一个聚合管道,允许您将数组展开为多个结果。
答案 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”。