2015-05-26 16 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()方法的投影文档中使用$。