2015-05-26 18 views
0

基於鍵從一個單一的文件哈希值的數組中選擇值我在items收集文檔一樣從mongoid

// Document One 
{ 
    "_id" : ObjectId("556411af73616d0d822f0000"), 
    "visibility" : [ 
     { 
      "user_id" : ObjectId("556412bb73616d0d82310000"), 
      "visible" : false 
     }, 
     { 
      "user_id" : ObjectId("556412c973616d0d82320000"), 
      "visible" : true 
     } 
    ] 
}, 

// Some other documents 
{...} 
{...} 

我只想爲基礎的「文檔一號」獲取的visible值我提供了user_id(例如ObjectId(「556412bb73616d0d82310000」))。

怎麼樣?

我使用的是mongoid 4.0.0。

謝謝。

回答

1

您可以通過兩種方式來實現:

1>使用投影$elemMatch$如下

db.collectionName.find({"visibility":{"$elemMatch":{"user_id":ObjectId("556412bb73616d0d82310000")}}}, 
{"visibility.$visible":1,"_id":0}) 

它retunrns結果

"visibility" : [ { "user_id" : ObjectId("556412bb73616d0d82310000"), "visible" : false } ] 

這回全匹配陣列visibility

2>使用aggregation如下:

db.collectionName.aggregate({ 
    "$unwind": "$visibility" 
}, { 
    "$match": { 
    "visibility.user_id": ObjectId("556412bb73616d0d82310000") 
    } 
}, { 
    "$project": { 
    "_id": 0, 
    "visible": "$visibility.visible" 
    } 
}) 

返回結果{ "visible" : false }

+0

總的來說,是有可能做不放鬆$? – user1735921

1

也許你可以試試這個:

db.one.find(
    {"visibility.user_id": ObjectId("556412bb73616d0d82310000")}, 
    {_id: 0, "visibility.$": 1}) 

在查詢語句db.collection.find(query, projection){"visibility.user_id": ObjectId("")}來選擇所需的項目,並{_id: 0, "visibility.$": 1}用於顯示指定的字段。 更重要的是,$操作符(投影)用於將輸出限制爲陣列中的匹配項。

官方文件:http://docs.mongodb.org/manual/reference/operator/projection/positional/#projection

$ 的位置$操作者從查詢結果限制的內容,以僅包含與查詢匹配的文件的第一個元素。要指定要更新的數組元素,請參閱位置$運算符以獲取更新。

當您只需要選定文檔中的一個特定數組元素時,在find()方法或findOne()方法的投影文檔中使用$。