【发布时间】:2018-09-07 06:13:28
【问题描述】:
我正在 AngularJS 和 Node 中编写一个 MongoDB 函数,我有一个集合,其中包含一个名为 documentId 的字段,该字段不是唯一的。我想在该集合中查找所有文档,其中特定文档的状态字段中没有一个包含单词 open,并且只包括所有状态为“关闭”或“取消”的文档。
例如:
_id: <val> , companyId : "CO-000001", documentId : "001", status:"closed", value:"123.45"
_id: <val> , companyId : "CO-000001", documentId : "002", status:"closed", value:"323.67"
_id: <val> , companyId : "CO-000001", documentId : "001", status:"open", value:"434.56"
_id: <val> , companyId : "CO-000001", documentId : "002", status:"canceled", value:"523.16"
我希望我的结果仅包含 documentId 002 而不是 documentId 001,因为 documentId 为 001 的文档之一包含打开状态。但由于 documentId 为 002 的所有文档的状态为已关闭或已取消,因此我想将其包含在结果中。
我可以使用以下命令从 db.collection.find() 中获取要排除的文档的汇总...
db.tickets.aggregate(
[
{
"$match" : {
"companyId" : "CO-000001",
"$and" : [
{
"status" : {
"$in" : [
"open","on hold"
]
}
}
]
}
},
{
"$group" : {
"_id" : null,
"uniqueValues" : {
"$addToSet" : "$documentId"
}
}
}
],
{
"allowDiskUse" : false
}
);
但现在我想在查询时使用聚合中的数组结果...
db.tickets.find("companyId":"CO-000001", $and:[{documentId:{$nin:[<results from aggregation>]}}])
有没有办法在另一个查询中使用聚合结果?或者有没有办法在聚合中完成所有这些操作?
【问题讨论】:
-
在聚合本身中使用 $lookup 来加入表并获得结果。
-
$lookup 将包含结果中的文档。我想排除它们。
-
随心所欲地投影
-
我认为你没有花时间去理解这个问题。投影允许您指定要返回的字段。我不希望排除字段,而是排除整个文档。我的印象是您不了解问题集。