【发布时间】:2019-02-13 13:07:45
【问题描述】:
我正在使用 mongo-go-driver (https://godoc.org/github.com/mongodb/mongo-go-driver/mongo),我正在尝试做相当于
db.getCollection('mycollection').aggregate([
{ $lookup: {
from: "anothercollection",
localField: "_id",
foreignField: "foreignID",
as: "matched_docs"
}},
{ $match: { "matched_docs": { $eq: [] } } },
{ $project: { "matched_docs": 0 } },
{ $match: {"dateTimeGMT":{$lt: (new Date(Date.now()-1000*60*60*24)).toISOString()}} }
])
我不知道如何使用这种方法放置 Javascript 命令。
pipeline := bson.NewArray(
bson.VC.DocumentFromElements(
bson.EC.SubDocumentFromElements(
//yada, yada, yada...
cursor, err := collection.Aggregate(ctx, pipeline)
(总的来说,无论如何我都不喜欢这种方法。我希望能够在 Robo 3T 中设计查询并将它们复制到我的代码中,就像我使用 MySQL Workbench 和 PHP 一样)
此方法在管道中产生一个空的 *bson.Array
pipelineJSON := `[
{ $lookup: {
from: "anothercollection",
localField: "_id",
foreignField: "interactionID",
as: "matched_docs"
}},
{ $match: { "matched_docs": { $eq: [] } } },
{ $project: { "matched_docs": 0 } },
{ $match: {"dateTimeGMT":{$lt: (new Date(Date.now()-1000*60*60*24)).toISOString()}} }
]`
pipeline, err = bson.ParseExtJSONArray(pipelineJSON)
如果有一种方法可以将 Mongo 的命令作为字符串发送(就像我在 Robo 3T 中键入它)并返回 *mongo.Cursor,我会非常喜欢它。我应该使用更好的驱动程序(仍然有人支持)吗?我需要自己编写代码吗?
谢谢!
【问题讨论】:
-
你不能。你需要在 Go 中找到一种等效的方法。那个 JS 没有什么特别的——它只是返回一个过去某个时间的日期值。在没有 JS 的情况下做同样的事情应该是绝对微不足道的。
-
Flimzy:你说 JS 没什么特别的,我可以用 time.Now().AddDate(0, 0, -1).UTC().Format( time.RFC3339) 在 golang 中。对所有人:为了澄清我的驾驶目的,有谁知道我在哪里可以找到有关驱动程序正在使用的底层 mongodb api 的文档,以便我可以确定该级别或仅在 mongo shell 中是否有可用的 javascript 解析器?
-
另外,澄清一下,JS 并不是唯一在 Robo3T/Mongo shell 中工作并且在 ParseExtJSONArray 中失败的东西。 ParseExtJSONArray 要求所有聚合阶段和函数都用引号括起来(而不是裸引号)。客户端golang程序有没有办法像shell一样查询mongo?
-
如果您的请求是“我在哪里可以找到 MongoDB 文档?”不幸的是,这里的问题是题外话,因为资源请求是题外话。但是,应该很容易找到 MongoDB API 文档。
-
很公平。我想我的问题的主题元素现在已经解决了,我正在转向题外话。我会用我学到的东西来回答这个问题。
标签: javascript mongodb go aggregate