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

MongoDB查询-从标记数组中查找其中一个,mongodb,mongoose,mongodb-query,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', hasht

我试图在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中,您可能会使用类似GROUPBY的东西,但如果不使用Map/REDUCT,我在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();

听起来您正在等待MongoDB的2.2版本,该版本将包括一个聚合管道,允许您将数组解绑到多个结果中


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

返回:

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

这是假设您的文档的格式为{name:“xxx”,hashtag:“tagX”),并且许多名称对应于每个hashtag。聚合管道所做的是使用$match将工作集限制为hashtag为“tag1”或“tag2”的工作集,然后我们按hashtag分组,并指定我们只希望保留每个分组的$first result($last是另一个选项)-假设您不关心返回的名称,只要它只是一个。$project用于将_id哪个组需要返回到字段名“hashtag”.

你能澄清一下你的文档是什么样子的吗?它是名称和hashtag数组吗?我不知道SQL group by在这里能为你做什么-看起来你想要任何带有tag1的单个图像名称,任何带有tag2的图像名称,任何带有tag3的图像名称?我甚至不确定这在你的应用程序中是否容易解决,更不用说在查询中了……不,我的文档没有这只是我试图完成的一个例子。SQL很容易做到这一点:选择*FROM
images
WHERE
hashtag
in('tag1','tag2','tag3'))GROUP BY
hashtag
;relational不会有一个hashtag数组,因此我仍然不理解您的SQL示例。您是否假设SQL会为每个名称/hashtag对都有一行?这将在2.2版的聚合框架中提供,您可以在其中展开数组,但您仍然需要解决如何保证y的问题你的每个名字和每个hashtag都没有重复。我没有说“hashtag”是一个数组。在这个例子中,它被用作字符串字段。我想你是想链接的,但我不确定它对解决这个问题是否有帮助。
{
         "result" : [
        {
            "hashtag" : "tag2",
            "name" : "1"
        },
        {
            "hashtag" : "tag1",
            "name" : "1"
        }
    ],
    "ok" : 1
  }