我们有一个库存集合:
stocks:
{"_id" : ObjectId("xxx"),"scrip" : "xxxxx2" }
{"_id" : ObjectId("xxy"),"scrip" : "xxxxx3" }
{"_id" : ObjectId("xyy"),"scrip" : "..." }
鉴于输入的股票清单[xxxxx7,xxxxx2,xxxxx3,xxxxx8]
,我们需要返回股票集合中不存在的股票清单。
所以预期的输出是:
[xxxxx7,xxxxx8]
是否有一种方法可以使用Filter.expr和$ setIsSubset(或任何其他替代方法)来实现。
无法获得相同示例。
感谢帮助
答案 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 Aggregation,SO link to java aggregation example