2015-07-20 126 views
3

我想从一个对象集合中获得一个记录结果,但是在遵循Mongoid文档之后,我不知道还有更多的尝试。为什么elem_match返回0个元素?

我有这样的一个元素:

> contacts 
=> #<Contact _id: 55ace6bc6xx, device_fields: {"app_id"=>"55ace6bc65195efc8200xxxx"}, created_at: 2015-07-20 12:17:00 
    UTC, updated_at: 2015-07-20 12:17:00 UTC, name_first: "Kory", 
    name_last: "Funk", ...> 

此匹配器的列表:

> apps = [] 
> apps << App.where(id: "55ace6bc65195efc8200xxxx").first.id 
=> ["55ace6bc65195efc8200xxxx"] 

而这个代码试图获得匹配的元素:

> contacts.elem_match(device_fields: {:app_id.in => apps }).to_a 
=> [] 
> contacts.elem_match(device_fields: { "app_id": "55ace6bc65195efc8200xxxx"}).to_a 
=> [] 

为什么返回一个空数组,它有一个匹配?

+0

你可以试试'contacts.elem_match(device_fields:{“app_id”:apps.first})。to_a'吗? –

+0

是的,结果相同。我尝试了这个以及很多可能的组合......我无法得到正确的回复 –

回答

2

据官方mongodb manual

的$ elemMatch运营商匹配包含数组字段

而你试图用哈希领域使用它的文件,所以你基本上是误解了这个选择。所以没有匹配的对象。

代替它,你应该做的:

contacts.where(:'device_fields.app_id'.in => apps).to_a 
+0

哦,是的!我正在将'has_many'关联(哈希)替换为'has_one',我试图重构旧的'elem_match'。这是真的,它不再是散列。现在看来都很清楚。谢谢 –

1

我无法通过match_elem方法来解决这个问题,所以最后我决定通过and。我对这个解决方案并不满意,我仍然不明白为什么match_elem没有返回记录,但至少我已经找到了一个解除这个功能的解决方案。

contacts.and(:device_fields.exists => true, 
      :device_fields.nin => ['', nil], 
      :"device_fields.app_id".in => apps).to_a 
+0

你不需要前两个子句。 –

1

你不需要elemMatch这里。它用于通过部分匹配来查找对象数组元素(其中不需要完全对象相等,但只有一个或多个字段)

这应该适用于您的情况。

contacts.where('device_fields.app_id' => {'$in' => apps})