2016-03-24 77 views
1

我正在努力處理MongoDB請求。我有一個Play架構,其中包含Move對象的數組。每個Move對象以ObjectID的形式保存對Player的引用。繼this question我試圖做Mongodb:查找至少有一個元素不匹配的數組的文檔ObjectID

{ 'moves.player': { $elemMatch : { $ne : playerId } } } 

其中playerId持有的對象ID。但是我得到的錯誤

Error: Can't use $elemMatch with ObjectId 

我也曾嘗試以下

{ 'moves.player.str': { $elemMatch : { $ne : playerId.toString() } } } 

,但沒有找到合適的文件...任何想法?

一些Play記錄:

A = { 
    "moves": [ 
     { player: { $oid: "56f32fe2f41638de3b3e4773" } }, 
     { player: { $oid: "56f32fe2f41638de3b3e4774" } } 
    ] 
} 
B = { 
    "moves": [ 
     { player: { $oid: "56f32fe2f41638de3b3e4773" } } 
    ] 
} 

查詢爲playerId = "56f32fe2f41638de3b3e4773"應僅返回對象A,因爲它是具有移動的陣列的玩家,其中至少一個唯一的一個不同於56f32fe2f41638de3b3e4773

+1

不幸的是。即使你找到了你自己的解決方案(或者至少你認爲你是這樣做的),這個問題並沒有顯示你實際上查詢的文檔結構。因此,任何人都沒有什麼用處,並且是一個很不明確的問題。顯示您期望匹配的示例文檔將使其更好。 –

+0

好的建議,增加了一個例子,這可能有助於理解問題。被困在這個很長一段時間,所以我懷疑它可能對別人有用。 –

回答

2

OK,發現問題出在哪裏了......只是做

{ "moves": { $elemMatch: { "player": { $ne : playerId } } } } 

,它工作了罰款!

+1

很確定,如果你的數據看起來像我「認爲」它確實(已經告訴過你,如果沒有其他人解決問題的樣本問問題不好),那麼就簡單地使用'{「moves.player」:{「$ ne」 :playerId}}'就夠了。當需要滿足「兩個或更多」屬性條件時,您只需要'$ elemMatch'。單一財產檢查可以用簡單的「點符號」來完成。 –

+0

'$ ne'不會返回'Play'記錄,其中一個'moves'被分配給具有'playerId'的玩家,所以在我的例子中既不會返回A也不會返回B ... –

+0

啊。現在我懂了。你的回答是正確的做法。 –

相關問題