根据mongoid中单个文档的键从散列数组中选择值

时间:2015-05-26 06:41:44

标签: mongodb ruby-on-rails-4 mongoid

我在items集合中有一个文档,如

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

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

我想根据我提供的visible(例如ObjectId(“556412bb73616d0d82310000”))获取{Document 1}的user_id值。

如何?

我正在使用mongoid 4.0.0。

感谢。

2 个答案:

答案 0 :(得分: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}用于显示指定的字段。     而且,$ operator(projection)用于将输出限制为匹配的数组。

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

  

$   位置$运算符将查询结果的内容限制为仅包含与查询文档匹配的第一个元素。要指定要更新的数组元素,请参阅位置$运算符以获取更新。

当您在所选文档中只需要一个特定的数组元素时,在find()方法或findOne()方法的投影文档中使用$。

答案 1 :(得分:1)

您可以通过两种方式执行此操作:

1>在投影中使用$elemMatch$,如下所示

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

它将结果重新调整为

"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 }