首页 > 解决方案 > 存在于输入数组中

问题描述

我们有一个股票收藏:

stocks:

{"_id" : ObjectId("xxx"),"scrip" : "xxxxx2" }
{"_id" : ObjectId("xxy"),"scrip" : "xxxxx3" }
{"_id" : ObjectId("xyy"),"scrip" : "..." }

给定一个纸币输入数组[xxxxx7,xxxxx2,xxxxx3,xxxxx8],我们需要返回一个股票集合中不存在的纸币数组。
所以预期的输出是:

[xxxxx7,xxxxx8]

有没有办法使用 Filter.expr 和 $setIsSubset(或任何其他替代方法)来实现这一点。
无法获得相同的示例。
帮助表示赞赏

标签: javaaggregation-framework

解决方案


假设收集中的数据:

股票:

{"scripid" : "xxxxx2" }
{"scripid" : "xxxxx3" }
{"scripid" : "xxxxx4" }

因此,如果您需要从输入数组中获取不在 股票集合中的元素列表,而不是从股票集合中获取不在输入数组中的元素列表,请使用以下命令:

db.stocks.aggregate([  {
             $group :{_id : null, scripids: {$push : '$scripid'}}
           },{ "$project": { _id:0 , "inputArrayNINscripts": { "$setDifference": [ ['xxxxx7','xxxxx2','xxxxx3','xxxxx8'] , "$scripids" ] } } } ])

输出:

{
    "inputArrayNINscripts" : [ 
        "xxxxx7", 
        "xxxxx8"
    ]
}

否则,如果您需要股票scripid中未通过的元素列表(scripid's) [xxxxx7,xxxxx2,xxxxx3,xxxxx8],如@Caconde 建议的那样,请尝试以下操作:

db.stocks.find({
    "scripid": {"$nin": ["xxxxx7","xxxxx2","xxxxx3","xxxxx8"]} 
}).toArray().map(scriptsNINArray => scriptsNINArray.scripid)

输出:

/* 1 */
[
    "xxxxx4"
]

附加组件:

根据要求提供 java 代码,请检查以下参考资料:

mongoDB-java-driver Aggregation , SO 链接到 java 聚合示例


推荐阅读