$ limit,$ match,$ ne的聚合返回的文档多于预期

时间:2019-03-20 23:30:31

标签: mongodb aggregation-framework

我有两个集合vmdetails和rsc_installtion_status,我想从rsc_installtion_status中选择在vmdetails中没有匹配主机名的文档

我使用了以下查询

 db.rsc_installtion_status.aggregate([{$lookup:{ from: "vmdetails",let: {rschostname: "$hostname"},pipeline:[{$match:{$expr:{$ne :["$hostname","$$rschostname"]}}}],as: "rscInstall"}},{$unwind:"$rscInstall"},{$project:{"_id":0,"rscInstall":0}}])

vmdetails中的记录数

> db.vmdetails.find().count()
4

中的记录数
> db.rsc_installtion_status.find().count()
37

37个文档中的三个与vmdetails中的文档匹配,所以我希望结果是34个文档,但是我得到的结果是每个文档3个记录,即34X3

{ "hostname" : "string", "configdownload" : "string", "rscpkgdownload" : "string", "configextraction" : "string", "rscpkgextraction" : "string", "rscstartup" : "string", "installedversion" : "string", "_class" : "com.mastercard.rsc.domain.RscInstalltionStatus" }
{ "hostname" : "string", "configdownload" : "string", "rscpkgdownload" : "string", "configextraction" : "string", "rscpkgextraction" : "string", "rscstartup" : "string", "installedversion" : "string", "_class" : "com.mastercard.rsc.domain.RscInstalltionStatus" }
{ "hostname" : "string", "configdownload" : "string", "rscpkgdownload" : "string", "configextraction" : "string", "rscpkgextraction" : "string", "rscstartup" : "string", "installedversion" : "string", "_class" : "com.mastercard.rsc.domain.RscInstalltionStatus" }

但是在$ match中,如果我使用$ eq而不是$ ne,结果是正确的,它仅输出三个记录。我该如何选择与主机名不匹配的记录

1 个答案:

答案 0 :(得分:0)

db.rsc_installtion_status.aggregate([ {$lookup : { from:"vmdetails", localField:"hostname", foreignField:"hostname" , as:"rscinstall" } }, { $match: { "rscinstall": { $eq: [] } } } ]) 

查找脚本是基本的脚本,下面的匹配是解决$ eq的脚本,该脚本检查数组是否为空并返回两个集合中不常见的文档。如果使用$ ne,它将返回两个集合中匹配的记录。

{ $match: { "rscinstall": { $eq: [] } } } ])