2011-06-08 80 views
5

我有一個集合與看起來像條目:

{ 
    "userid": 1, 
    "contents": [ 
      { "tag": "whatever", "value": 100 }, 
      {"tag": "whatever2", "value": 110 } 
    ] 
} 

我希望能夠在該集合查詢和返回數組中只有一個部分:一個與查詢匹配。我試圖使用$位置運算符來做到這一點,但目前爲止還沒有成功。

這是更準確,我想做些什麼:

collection.find({'contents.tag':"whatever"},{'contents.$.value':1}) 

因此,我期待某物對應的數組中的條目相匹配的查詢,這是100在這種情況下,只有價值。

你知道怎麼回事嗎?我在想,也許$操作符只能用於更新,而不能用於查詢。知道的人?

謝謝!

+0

只是爲宗旨,以只返回你的價值領域,一個'collection.find({」 contents.tag':'whatever'},{'contents.value':1})'就足夠了,不需要位置操作符。儘管如此(正如Ryan在他的回答中已經提到的那樣),有必要在應用程序端將字段從返回的數組中取出(這也包括文檔的'_id')。缺點是,關於嵌套數組的'findOne'或'limit(1)'不起作用,如果您不期望超過1個結果,則這不會成爲可能。 – proximus 2011-06-08 16:03:01

回答

8

是的,你是正確的 - 位置操作符用於更新對象。

現在的解決方案是在應用程序中返回數組。

有這個功能的開放增強請求(查詢):

https://jira.mongodb.org/browse/SERVER-828

有關位置操作的更多信息,請參見:

http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

+0

是的謝謝你的答案。我想我現在必須在應用程序方面做到這一點!這很奇怪,因爲如果他們實施更新,它不應該是非常不同的發現...不管怎樣,希望功能即將推出! – Johanisma 2011-06-09 13:17:09

+1

同意......請在Jira投票支持問題以幫助將其投入產品。 – Ryan 2011-06-10 13:40:32

+0

顯然沒有實現:(他們建議使用'$ elemMatch'。 – MaicolBen 2014-03-27 13:36:39

0

這可能是一個矯枉過正,但我​​想你可以使用map-reduce。

首先,使用查詢進行預過濾,發射映射中的所有數組元素,過濾那些在發射或減少中不匹配的元素。如果你沒有列出在RAM中會發生的一切。

如果您必須經常運行這些查詢,那麼複製數據可能是值得的。

儘管如此,我希望SERVER-828能很快實現!

7

你在找什麼是$elemMatch運營商。

+1

這實際上是正確答案 – MaseBase 2012-10-17 00:52:52

+0

您可以詳細說明$ elemMatch如何在這種情況下用於返回匹配對象的一部分數組? – gaurav5430 2017-08-29 19:27:11

0

中,而不是創建$查詢和你相等值添加到陣列,這能夠解決您的問題

$users_array = array(xxxxxxxx,yyyyyy);  
$user = Db::find('fb_users', array(
          'facebook_id' => array(
           '$in' => array($users_array) 
          ) 
         ));