【问题标题】:grails-mongodb: findAllBy*InList not returning results in ordergrails-mongodb:findAllBy*InList 未按顺序返回结果
【发布时间】:2015-07-07 06:55:00
【问题描述】:

我正在使用 grails2.4.4 和 mongodb 插件版本 3.0.3。我在获取域对象的结果时遇到了问题。我正在使用以下代码:

我的域名:

Employee{
   ObjectId id
   String name
}

我有 ids 列表,使用下面的代码来获取员工:(请注意,下面的数据只是为了代表我的问题。在实时,我的 ids 是随机的,所以我不能使用排序,但我只想要结果按输入顺序。)

def idsList=[new ObjectId("2001"), new ObjectId("2002"), new ObjectId("2003")]
def results=Employee.findAllByIdInList(idsList)

预期结果:

[Employee@2001,Employee@2002,Employee@2003]

实际结果(不按顺序):

[Employee@2002, Employee@2003 , Employee@2001] or sometimes
[Employee@2003, Employee@2001 , Employee@2002]

现在我这样做是为了按所需顺序获得输出:

def results=[]
for(id in idsList){
   def emp=Employee.findById(id)
results<<emp
}

但我想通过单个调用 (findAllBy*InList) 来执行此操作,而无需迭代对象。谁能告诉我如何按输入ID的顺序获得结果?

【问题讨论】:

  • 澄清$in 是应用于*InList 方法的参数的运算符。
  • 哦.. 这意味着它是底层 mongodb 的问题,而不是 grails 或 mongodb 插件的问题。在这种情况下,我使用的解决方案是我目前保留订单的唯一选择。非常感谢您的链接@BlakesSeven
  • 正如我所说。该方法构造一个$in 查询。重复问题中的答案显示了处理此问题的服务器端方法。否则,在返回结果后对结果进行排序。这不是 MongoDB 的“问题”,而是它的工作方式。
  • 哦,好的。我不能使用排序,因为在我的实时案例中,ID 是随机的,所以我希望结果按输入顺序排列。我会更新我的问题。

标签: mongodb grails grails-orm grails-2.4


【解决方案1】:

你试过了吗

Employee.findAllByIdInList(idsList, [sort: 'id', order:'asc'])

?它应该按预期工作

如果没有,您可以使用 for 循环来代替

def result = idList.collect { id -> Employee.findById(id) }

【讨论】:

  • 嗨,您的第一个解决方案是按 id 对对象进行排序。我只是举例说明了我的问题。事实上,我只想要给定输入顺序的结果,因为在我的实时情况下,ID 是随机的。您的第二种解决方案方法与我的相同,但以更时髦的方式。无论如何感谢您的建议:)
  • 对不起,从问题(编辑前)中不清楚 id 没有按顺序排列。第二点:在我看来,collect 更具可读性和更短,因此它接近您的要求。您也可以使用Employee.get(id),而且字符更少:)。干杯!
  • 知道了。将按照您的建议更改我的代码以使其更清洁。谢谢你:)
猜你喜欢
  • 2018-08-29
  • 2015-12-05
  • 2013-01-19
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多