MongoDBstring不在文档数组中

时间:2017-01-18 07:01:34

标签: arrays mongodb mongodb-query

我有这个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 ?

3 个答案:

答案 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 系统变量排除任何字段。实际上,它在文档级别充当匹配过滤器。