如何从mongoDB中的Object获取字段列表?

时间:2013-05-28 10:46:31

标签: php mongodb

我是mongoDB的新手,我看到了很多例子,但大多数都展示了如何使用集合。

我在数据库名称myDB下跟踪了存储在mongoDB中的数据:

"_id" : "some_table_name",
"content" : [{
  "id" : "1",
  "loctype" : "Clinic/Hospital",
  "locname" : "KKH"
}, {
  "id" : "2",
  "loctype" : "Clinic/Hospital",
  "locname" : "Singapore National Eye Centre"      
 }
 }]
}

如您所见,模型包含_idcontent,其中content是对象列表:

  ... ,
 {
  "id" : "ZZZ",
  "loctype" : "ZZZ",
  "locname" : "ZZZ"      
  },
  ...

PHP

$m = new MongoClient(/* ... */);

$db = $m->myDB;

$collection = $db->coll;

我如何获取PHP的ID列表? a.e [1,2]在我的情况下。

我确实可以获得所有模型和提取ID,但我尝试从mongoDB直接进行。

感谢。

3 个答案:

答案 0 :(得分:2)

试试这个:

$collection = new MongoCollection($db, 'collection_name');

$query = array(
// Some restrictions can be here
);

$ids    = array();
$cursor = $collection->find($query);
foreach ($cursor as $doc) {
    $doc = (array) $doc;
    $ids[] = $doc["id"];
}

var_dump($ids);

答案 1 :(得分:2)

这取决于您希望如何格式化,但这里是一个聚合版本,它以一种很好的方式格式化它:

$mongo->collection->aggregate(array(
    array('$unwind'=>'$content'),
    array('$project'=>array('_id'=>'$content.id'))
))

它将打印如下文件:

[
    {_id:1},
    {_id:2}
]

另一种方法是使用$db->collection->find(array(),array('content.id'=>1))

将单个字段投影出去

我应该注意,在PHP中最好这样做。通过PHP是您可以获得我相信的确切输出的唯一方法。

答案 2 :(得分:1)

使用mapreduce后跟distinct,如下所示:

mr = db.runCommand({
  "mapreduce" : "things",
  "map" : function() {
    for (var key in this) { emit(key, null); }
  },
  "reduce" : function(key, stuff) { return null; }, 
  "out": "things" + "_keys"
})
db[mr.result].distinct("_id")
["foo", "bar", "baz", "_id", ...]

或使用Variety ...