在mongodb中使用2个不同的结果集

时间:2013-11-16 00:25:42

标签: mongodb groovy pentaho

我正在和mongodb一起使用groovy。我有一个结果集,但需要来自不同文档组的值。如何将该值提取到我需要的结果集中?

主要:网络数据

"resource_metadata" : {
"name" : "tapd2e75adf-71",
"parameters" : { },
"fref" : null,
"instance_id" : "9f170531-79d0-48ee-b0f7-9bd2788b1cc5"}

我需要display_name作为计算数据中包含的网络数据结果集。

CPU数据

"resource_id" : "9f170531-79d0-48ee-b0f7-9bd2788b1cc5",
"resource_metadata" : {
"ramdisk_id" : "",
"display_name" : "testinstance0001"}

您可以看到resource_id和Instance_id是相同的值。我知道我没有任何关系可以做,但试图找到是否有人遇到这个。我正在使用表模型来检索报告数据。 Hashtable已被建议给我,但我没有看到它工作。不知何故,在hasNext中我需要包含display_name值。在网络数据中,因此GUID号不仅显示计算数据中的有效名称。

def docs = meter.find(query).sort(sort).limit(50)\
while (docs.hasNext()) { def doc = docs.next()\
model.addRow([ doc.get("counter_name"),doc.get("counter_volume"),doc.get("timestamp"),\ 
doc.get("resource_metadata").getString("mac"),\
doc.get("resource_metadata").getString("instance_id"),\
doc.get("counter_unit")] 
as Object[]);}

完整文件: 第一组,我需要网络数据测量,没有名称只有id {resource_metadata.instance_id}

  {
"_id" : ObjectId("528812f8be09a32281e137d0"),
"counter_name" : "network.outgoing.packets",
"user_id" : "4d4e43ec79c5497491b23b13644c2a3b",
"timestamp" : ISODate("2013-11-17T00:51:00Z"),
"resource_metadata" : {
"name" : "tap6baab24e-8f",
 "parameters" : { },
 "fref" : null,
 "instance_id" : "a8727a1d-4661-4565-9c0a-511279024a97",
 "instance_type" : "50",
 "mac" : "fa:16:3e:a3:bf:fc"
 },
"source" : "openstack",
"counter_unit" : "packet",
"counter_volume" : 4611911,
"project_id" : "97dc4ca962b040608e7e707dd03f2574",
"message_id" : "54039238-4f22-11e3-8e68-e4115b99a59d",
"counter_type" : "cumulative"
 }

我想获取值{resource_id}时,我想要获取名称的第二组:

 "_id" : ObjectId("5287bc3ebe09a32281dd2594"),
"counter_name" : "cpu",
"user_id" : "4d4e43ec79c5497491b23b13644c2a3b",
"message_signature" :  
"timestamp" : ISODate("2013-11-16T18:40:58Z"),
"resource_id" : "a8727a1d-4661-4565-9c0a-511279024a97",
"resource_metadata" : {
 "ramdisk_id" : "",
 "display_name" : "vmsapng01",
 "name" : "instance-000014d4",
 "disk_gb" : "",
 "availability_zone" : "",
 "kernel_id" : "",
 "ephemeral_gb" : "",
 "host" : "3746d148a76f4e1a8203d7e2378ef48ccad8a714a47e7481ab37bcb6",
 "memory_mb" : "",
 "instance_type" : "50",
 "vcpus" : "",
 "root_gb" : "",
 "image_ref" : "869be2c0-9480-4239-97ad-df383c6d09bf",
 "architecture" : "",
 "os_type" : "",
 "reservation_id" : ""
  },
  "source" : "openstack",
  "counter_unit" : "ns",
"counter_volume" : NumberLong("724574640000000"),
"project_id" : "97dc4ca962b040608e7e707dd03f2574",
"message_id" : "a240fa5a-4eee-11e3-8e68-e4115b99a59d",
"counter_type" : "cumulative"
  }

这是另一个包含相同值的集合,但只是认为从同一个集合中抓取更容易:

 "_id" : "a8727a1d-4661-4565-9c0a-511279024a97",
 "metadata" : {
"ramdisk_id" : "",
"display_name" : "vmsapng01",
"name" : "instance-000014d4",
"disk_gb" : "",
"availability_zone" : "",
"kernel_id" : "",
"ephemeral_gb" : "",
"host" : "3746d148a76f4e1a8203d7e2378ef48ccad8a714a47e7481ab37bcb6",
"memory_mb" : "",
"instance_type" : "50",
"vcpus" : "",
"root_gb" : "",
"image_ref" : "869be2c0-9480-4239-97ad-df383c6d09bf",
"architecture" : "",
"os_type" : "",
"reservation_id" : "",
 }

麦克

1 个答案:

答案 0 :(得分:0)

看起来这些数据在2个不同的集合中,这是正确的吗?

您能查询每个“instance_id”(“resource_id”)的CPU数据吗?

或者,如果这会导致对数据库的查询太多(看起来你限制为50 ...),你可以使用$ in和所有“Instance_id”的列表 http://docs.mongodb.org/manual/reference/operator/query/in/

无论哪种方式,您都需要单独查询每个集合。