2012-08-02 42 views
2

我有这种简单分贝,包含元素的子集:mongodb的序列化的子集结果

{ "_id" : ObjectId("5019eb2356d80cd005000000"), 
    "photo" : "/pub/photos/file1.jpg", 
    "comments" : [ 
     { 
      "name" : "mike", 
      "message" : "hello to all" 
     }, 
     { 
      "name" : "pedro", 
      "message" : "hola a todos" 
     } 
    ] 
}, 
{ "_id" : ObjectId("5019eb4756d80cd005000001"), 
    "photo" : "/pub/photos/file2.jpg", 
    "comments" : [ 
     { 
      "name" : "luca", 
      "message" : "ciao a tutti" 
     }, 
     { 
      "name" : "stef", 
      "message" : "todos bien" 
     }, 
     { 
      "name" : "joice", 
      "message" : "vamos a las playa" 
     } 
    ] 
} 

当我执行一个子集的发现: db.photos.find({},{ “comments.name”:1 })

林收到此结构:

[ 
    { 
     "_id" : ObjectId("5019eb2356d80cd005000000"), 
     "comments" : [ 
      { 
       "name" : "mike" 
      }, 
      { 
       "name" : "pedro" 
      } 
     ] 
    }, 
    { 
     "_id" : ObjectId("5019eb4756d80cd005000001"), 
     "comments" : [ 
      { 
       "name" : "luca" 
      }, 
      { 
       "name" : "stef" 
      }, 
      { 
       "name" : "joice" 
      } 
     ] 
    } 
] 

但我希望得到一个简单的一维数组,像这样的(或类似):

[ 
    { 
     "name" : "mike" 
    }, 
    { 
     "name" : "pedro" 
    }, 
    { 
     "name" : "luca" 
    }, 
    { 
     "name" : "stef" 
    }, 
    { 
     "name" : "joice" 
    } 
] 

我需要蒙戈PHP的官方驱动程序来实现此查询,但语言并不重要,我只是想通过什么逻辑来理解,我可以通过蒙戈完成这个壳

TNK!

回答

2

最简单的方法是使用distinct()

>db.photos.distinct("comments.name"); 
[ "mike", "pedro", "joice", "luca", "stef" ] 

这是一个使用JavaScript的另一个例子:

// Array to save results 
> var names = [] 

// Find comments and save names 
> db.photos.find({},{"comments.name":1}).forEach(
      function(doc) { doc.comments.forEach(
       function(comment) {names.push(comment.name)}) 
      }) 

// Check the results 
> names 
[ "mike", "pedro", "luca", "stef", "joice" ] 

下面是一个使用在即将到来的MongoDB 2.2新聚合框架的例子:

db.photos.aggregate(
    { $unwind : "$comments" }, 
    { $group : { 
    _id: "names", 
    names: { $addToSet : "$comments.name" } 
    }}, 
    { $project : { 
    '_id' : 0, 
    'names' : 1, 
    }} 
) 
+0

谢谢Stennie 我认为有可能是一个更简单的解决方案,但在这之上对于文档的几个深度级别来说是很好的。 (这个解决方案将需要每个深度的foreach循环) 或者我认为也许我错了,因为我创建了我的数据库设计,也许我应该使用 – StefanoCudini 2012-08-03 00:09:35

+1

@StefanoCudini:添加了一个使用MongoDB中的聚合框架的例子2.2rc0 。在这种情况下,实际上不需要位置运算符..只需要查找和分组独特的值。 – Stennie 2012-08-03 02:26:57

+0

好的解决方案!但我使用的是mongodb而不是debian squeeze服务器,不幸的是我不能使用更新版本的1.4.4 我是一个新手MongoDB,我想也许我在项目应用程序中是错误的,也许我应该使用单独的集合然后将其放入dbref“comments”数组中:[..] 这样我就可以检索包含每个文档上所有注释的单个查询。 尚未能做出正确的选择,您认为最好的解决方案是什么? 或者如果2.2版本正在快速增长并且更好地升级您的版本而不是跟随debian存储库? – StefanoCudini 2012-08-05 00:42:37