2014-01-19 75 views
3

的编号顺序在数组包含的元素我有一个的MongoDB与期待,因为这类文件的集合:查询的MongoDB在匹配元素

{ 


_id: ObjectId("5222769532fed3037d000049"), 


cat_list: { "52226a8932fed36c3000007e": 1 }, 
feature_list: { 
    "52227433abb03fa34b0000fa": 0.2, 
    "52236117099c8924c500004a": 0.2, 
    "52236236c71890c199000054": 0.2, 
    "522374d2842e497d2c00000c": 0.2, 
    "52237e3b842e493760000021": 0.2 }, 
title: "blah" 

}

现在我基本上婉来查找文档它们与提供给feature_list中的按键的一组按键相匹配。为此,我想我会使用某种形式的$ in [,],尽管我不知道如何使用key:value列表来完成此操作。 (是不是一样的吗?)

其次,我想订购由降频的结果(如果我能做到这一点在MongoDB中,而不必做它在我的服务器端代码)。所以,如果我查询"52227433abb03fa34b0000fa" OR "52236117099c8924c500004a" OR "52236236c71890c199000054",我的结果集将包含所有具有含一种或多种那些在OR列表,并与最大量的比赛将是第一个文档中的feature_list的文件,然后在频率下一个和等等。

+0

只是为了澄清:你想按字段名称查找,而不是按值查找?例如,您是否必须返回完整的匹配文档或仅仅是ID? –

回答

2

要查找所有这些文件与给定值的字段中的至少一个,你可以使用此查询:

db.aggr.find({$or: [ 
{ "feature_list.52227433abb03fa34b0000fa" : { $exists: true } }, 
{ "feature_list.52236117099c8924c500004a" : { $exists: true } }, 
{ "feature_list.52236236c71890c199000054" : { $exists: true } } 
]}); 

其中找到您的文档:

{ 
    "_id" : ObjectId("5222769532fed3037d000049"), 
    "cat_list" : { 
     "52226a8932fed36c3000007e" : 1 
    }, 
    "feature_list" : { 
     "52227433abb03fa34b0000fa" : 0.2, 
     "52236117099c8924c500004a" : 0.2, 
     "52236236c71890c199000054" : 0.2, 
     "522374d2842e497d2c00000c" : 0.2, 
     "52237e3b842e493760000021" : 0.2 
    }, 
    "title" : "blah" 
} 

但你不能真正按照你想要的方式排序,因为没有任何可排序的东西。我想通过这些搜索域进行排序的,如果你搜索一个字段,因为丢失的领域将有lowest value它会工作。但是,在这种情况下,多个字段sort中的字段顺序很重要,这个技巧不起作用。

什么也不起作用正试图通过整个子文档进行排序,即.sort({"feature_list" : -1})因为它没有给出任何有意义的排序。

所以在这一点得到这些结果的唯一方式是使用聚合框架,多个查询(3例),或做在你的代码。

我敢肯定,我可以写一个聚合框架查询做到这一点,但首先你会被你可以装在单个文件大小(32MB)结果的数量是有限的。如果你只返回ids,那会更好一点。其次,它可能实际上并不那么高效。最后,您可能会考虑重新设计架构,因为它是非常规的。这使得查询变得困难和低效。

编辑

一个模式可以被重新设计,这样的:

{ ..., 
    feature_list: [ 
    {fid: "52227433abb03fa34b0000fa", weight: 0.2}, 
    {fid: "52236117099c8924c500004a", weight: 0.2} 
    ] 
} 

这仍然没有使用常规的查询排序帮助,但是发现数据会快很多,因为蒙戈不使用索引对于$exists,但将在这个新模式中使用索引(如果存在),其中字段变为数据。没有办法在Mongo中按数组中匹配元素的数量进行排序。

您可以在一个非常类似的方式来使用聚合框架,而不是常规查询的数据得到: In MongoDB search in an array and sort by number of matches 的问题是,你只能得到尽可能多的结果能适应与聚合框架一个文件内。为了最大限度地利用它,您可以在最后步骤中仅投射文档的_id。

替代使用聚合框架的方法是在找到结果后,在代码中对数据进行排序。在任何一种情况下,由于索引,重新设计模式似乎都是有益的

+0

对于模式修订,您有什么建议?我试图对我的数据建模,以便我可以将文档与关联权重“特征”文档关联起来,就像在神经网络中一样。 – Lehel

+0

您是否认为MapReduce将是一种排序的好方法? – Lehel

+0

这很难说。也许你可以在代码中完成,或者使用map reduce。也许需要一些测试。地图缩小可能涉及较少,但会将结果集大小限制为16Mb。 –