2015-04-17 109 views
0

例如,我的文檔包含一個數組;完全匹配數組的過濾器

{ 
    "a": [ 2, 3 ], 
    "id": ... 
} 

我想只返回其a僅包含元件2和3

這是我還沒有找到最簡單的文件;

r.table("t").filter(r.row('a').difference([2,3]).eq([])) 

有沒有更好的方法?

回答

1

編寫相同功能的好方法是使用.isEmpty而不是.eq([])

r.table("t") 
.filter(r.row('a').difference([2,3]).isEmpty()) 

該查詢等同於您編寫的函數。

這就是說,您當前的查詢將返回文檔,其中a只有2和/ 3.因此,例如,具有a: [2]的文檔會匹配。

示例結果集:

{ 
    "a": [ 2 ] , 
    "id": "f60f0e43-a542-499f-9481-11372cc386c8" 
} { 
    "a": [ 2, 3 ] , 
    "id": "c6ed9b4e-1399-47dd-a692-3db80df4143c" 
} 

這可能是你想要的,但如果你只想要的文件,其中a屬性是[2, 3]或精確[3, 2],不包含其他元素,您可能希望只使用.eq

r.table("t") 
.filter(r.row('a').eq([2,3]).or(r.row('a').eq([3, 2]))) 

實施例的結果:

{ 
    "a": [ 2, 3 ] , 
    "id": "c6ed9b4e-1399-47dd-a692-3db80df4143c" 
}, { 
    "a": [ 3, 2 ] , 
    "id": "cb2b5fb6-7601-43b4-a0fd-4b6b8eb83438" 
} 
+0

嗨豪爾赫。在這種情況下,數組永遠不會少於2個元素,所以我認爲這是更好的解決方案,因爲.eq([2,3])比較需要首先對元素進行排序。這就是說,我錯過了isEmpty() - 謝謝! – cachvico

+0

我更新了我的解決方案,只用'eq'來匹配'[2,3]'或'[3,2]',這樣答案就更準確了。 –

+0

另外,我花時間回答你的問題,似乎我正確回答了它。我可能最好將它標記爲已回答:)。謝謝! –