【问题标题】:How can I find the first matches in an array in Mongo?如何在 Mongo 的数组中找到第一个匹配项?
【发布时间】:2015-01-07 17:10:36
【问题描述】:

我有一个项目数组,我会在我的 mongo db 中找到其中的第一个匹配项。

数组是这样的,但可能很长:["item:9802", "item:15051", "item:10028", "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 很陌生,所以也许这是一个非常简单的问题,但我希望任何人都可以帮助我。

【问题讨论】:

  • 你应该使用coll.find(search_hash).limit(3)
  • 感谢您的回答,但问题是排序不正确。在这两种情况下,它都会按顺序返回 ["item:10028", "item:15051", "item:9802"],而我只想要数组中的第一个命中。例如,limit(1) 应该在第一种情况下给出 ["item:9802"],在第二种情况下给出 ["item:2355"]。
  • 您的订购输出应该是什么?
  • 我想要按数组的顺序点击。最好不要循环数组,因为它会变得很大,我只需要第一个或前 3 个。
  • 刚刚标记了您的基本副本。这就是您保留在$in 子句中提供的顺序的方式。将其与聚合中的$limit 结合起来,作为前面提到的一部分,您就有了完整的答案。

标签: ruby arrays mongodb mongodb-query


【解决方案1】:

您的查询应该是:

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?

【讨论】:

  • 这会返回所有匹配的文档,按照 id 的顺序,并且只返回前 3 个。
  • 我希望按数组顺序排列命中,按照我提供的数组顺序排列。最好不要循环数组,因为它会变得很大,我只需要第一个或前 3 个。
  • 您的in 查询会根据数据库记录给出结果。然后对其进行排序。
【解决方案2】:

感谢您的回答和建议。 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 查询,我仍然很感兴趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 2013-02-21
    相关资源
    最近更新 更多