存在于输入数组中

时间:2019-08-16 14:03:42

标签: java aggregation-framework

我们有一个库存集合:

stocks:

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

鉴于输入的股票清单[xxxxx7,xxxxx2,xxxxx3,xxxxx8],我们需要返回股票集合中不存在的股票清单。
所以预期的输出是:

[xxxxx7,xxxxx8]

是否有一种方法可以使用Filter.expr和$ setIsSubset(或任何其他替代方法)来实现。
无法获得相同示例。
感谢帮助

2 个答案:

答案 0 :(得分:0)

您可以使用MongoDB的 Not In 运算符$nin并将结果映射到数组来达到预期的结果:

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

答案 1 :(得分:0)

假设收集中的数据:

库存:

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

因此,如果您需要从输入数组中获取不在元素列表中的 scripid 中的元素列表,而无需从元素列表中获取元素列表不在输入数组中,则使用此:

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

输出:

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

否则,如果您需要未通过[xxxxx7,xxxxx2,xxxxx3,xxxxx8]的股票 scripid 中的元素(scripid)元素列表,请按照@Caconde的建议尝试:

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

输出:

/* 1 */
[
    "xxxxx4"
]

附加组件:

根据Java代码的要求,请检查以下参考:

mongoDB-java-driver AggregationSO link to java aggregation example