我有这个MongoDB documentFile Collection条目:
db.DocumentFile.find().pretty()
{
"_id" : ObjectId("587f0d61473c92b933a68efa"),
"_class" : "com.xxx.dao.domain.DocumentFile",
"fileName" : "DocumentFile1",
"ending" : "jpg",
"projectId" : "587f0d61473c92b933a68ef9",
"active" : true,
"userIdBlackList" : [
"587f0d61473c92b933a68ef8"
]}
现在我会找到文件文件,其中某些ID不在 userIdBlackList 中。 我试过这个:
db.DocumentFile.find({“userIdBlackList”:{“$ ne”:“587f0d61473c92b933a68ef8”}})。pretty();
但我仍然得到文件档案:
{
"_id" : ObjectId("587f0d61473c92b933a68efa"),
"_class" : "com.smartinnotec.legalprojectmanagement.dao.domain.DocumentFile",
"fileName" : "DocumentFile1",
"ending" : "jpg",
"projectId" : "587f0d61473c92b933a68ef9",
"active" : true,
"userIdBlackList" : [
"587f0d61473c92b933a68ef8"
]}
MongoDB是否有可能说:@ Document#someArrayOfDocument中没有包含某些字符串时返回文档?
我也尝试了这个查询
db.DocumentFile.find({"587f0d61473c92b933a68ef8" : { "$nin" : ["587f0d61473c92b933a68ef8"]}}).pretty() -> returns the document, don't know why
db.DocumentFile.find({"587f0d61473c92b933a68ef8" : { "$in" : ["587f0d61473c92b933a68ef8"]}}).pretty() -> does not return the document, also dont know why
db.DocumentFile.find({"587f0d61473c92b933a68ef8" : { "$nin" : userIdBlackList}}).pretty() -> [main] ReferenceError: userIdBlackList is not defined -> but how I can specify userIdBlackList ?
答案 0 :(得分:1)
你的黑名单ID是什么? 您的查询应如下所示:
db.DocumentFile.find({userIdBlackList: {"$nin":["blacklistId1", "blacklistId2"]}})
您可以使用"587f0d61473c92b933a68ef8"
作为您的blacklistIds之一。
答案 1 :(得分:1)
应该使用 $elemMatch
db.DocumentFile.find({"userIdBlackList": { $elemMatch: { $ne: "587f0d61473c92b933a68ef8" } } }).pretty();
要查询多个值,您可以使用 $nin
db.DocumentFile.find({"userIdBlackList": { $nin: ["587f0d61473c92b933a68ef8", "587f0d61473c92b933a68ef9", ... <more values>] } }).pretty();
希望这有帮助。
答案 2 :(得分:0)
您还可以使用聚合框架中提供的 $redact
作为过滤收藏的方法:
db.DocumentFile.aggregate([
{
"$redact": {
"$cond": [
{
"$setIsSubset": [
[ "587f0d61473c92b933a68ef8" ],
"$userIdBlackList"
]
},
"$$PRUNE",
"$$KEEP"
]
}
}
])
在上文中, $redact
管道将使用 $setIsSubset
运算符评估userIdBlackList
字段,该运算符采用两个数组并且当第一个数组是第二个数组的子集时返回true,包括第一个数组等于第二个数组时,否则返回false。
如果数组[ "587f0d61473c92b933a68ef8" ]
是"$userIdBlackList"
数组的子集,则 $redact
会排除当前文档/嵌入文档级别的所有字段,而无需进一步检查使用 $$PRUNE
系统变量排除任何字段。实际上,它在文档级别充当匹配过滤器。