如何在Mongo中找到数组中的第一个匹配项?

时间:2015-01-07 17:10:37

标签: ruby arrays mongodb mongodb-query

我有一系列项目,我会在我的mongo db中找到第一个匹配项。

阵列是这样的,但可能很长:[" item:9802"," item:15051"," item:10028",& #34; item:6575"," item:2355"] 我需要的是前三个命中,可以在mongo db中找到。并非所有ID都存在。

我使用github.com/mongodb/mongo-ruby-driver。 我做的是这个

search_hash = {:id=>{"$in"=>["item:9802", "item:15051", "item:10028", "item:6575", "item:2355"]}}
found = coll.find(search_hash).to_a

但是当我使用完全不同的顺序时,我发现这会返回完全相同的结果(并以相同的顺序),例如:

search_hash = {:id=>{"$in"=>["item:2355", "item:6575", "item:9802", "item:15051", "item:10028"]}}

无论如何要获得第一个匹配而不必遍历数组(这是非常长的)并在每个循环上执行查找? 我对Mongo很新,所以也许这是一个非常简单的问题,但我希望任何人都可以帮助我。

2 个答案:

答案 0 :(得分:0)

您的查询应该是:

search_hash = {id: {$in: ["item:9802", "item:15051", "item:10028", "item:6575", "item:2355"]}}
db.coll.find(search_hash).limit(3).sort({id: 1})

阅读此Combine Cursor MethodsDoes MongoDB's $in clause guarantee order?

答案 1 :(得分:0)

感谢您的回答和建议。 "聚合"来自Does MongoDB's $in clause guarantee order?的方法似乎是在Mongo中做到这一点的最好方法,但我发现这非常麻烦。我只是想确保我得到一个结果,所以我发送更多的ID来寻找,以确保我找到至少一些东西。我不想为所有事情分配权重而烦恼。我决定只是循环遍历这些项目,如果我发现了某些内容就会中断,例如:

item_ids = params['item_ids'].split('&').uniq.first(30).map {|key| "#{item}:#{key}"}
found = []
item_ids.each do |item_id|
  found = coll.find({id: item_id}).to_a
  break if found.any?
end
if found.any?
  ## The rest of my logic, using the first hit from my array.

对我来说,这是最容易阅读,维护和理解的。 如果有人有更好的方法只涉及一个Mongo查询,我仍然非常感兴趣。