Mongodb在聚合中存储了函数

时间:2014-03-19 09:34:34

标签: mongodb aggregation-framework mongodb-java

我使用以下查询从mongo-db获取数据:

db.FetchedUrl.aggregate({
  "$match": {
    "type": db.eval('echoFunction(\"news\")')
  }
})

这是我的存储功能:

db.system.js.save({
  _id: "echoFunction",
  "value": function(x){return x}
})

此代码在mongo-db shell上运行正常。如何编写等效的Java代码来聚合调用存储的函数?

1 个答案:

答案 0 :(得分:1)

我认为你需要了解实际在这里发生了什么。以此为例,您可以在shell中自己完成。所以在那里声明一个变量:

var param = db.eval('echoFunction(\"news\")');

然后像这样再次聚合:

db.FetchedUrl.aggregate({
  "$match": {
    "type": param
  }
})

这是事情。您知道您的服务器上没有名为“param”的“已存储”变量,但当然结果与之前的结果相同。

这是因为,与您所做的相同一样,此值在“shell”评估 之前被发送到服务器。

因此,在这种情况下,您的“服务器端”功能在执行聚合时不提供任何服务器侧评估。

这意味着您编写的任何“Java”代码将预先评估发送到服务器之前发送的BSON文档中

因此,无论您使用什么方式“获取”此值,您都需要在“Java”代码中编写它。然后通过驱动程序提供的方法将该值作为BSON文档中相同键的值放入。

MongoDB网站上的aggregation with the Java driver有一些注释。