数组中的Mongoose数组元素ALL $

时间:2016-11-11 19:56:03

标签: arrays node.js mongodb

我有一个这样的数组:

{
    "_id" : ObjectId("581b7d650949a5204e0a6e9b"),
    "types" : [ 
        {
            "type" : ObjectId("581b7c645057c4602f48627f"),
            "quantity" : 4,
            "_id" : ObjectId("581b7d650949a5204e0a6e9e")
        }, 
        {
            "type" : ObjectId("581ca0e75b1e3058521a6d8c"),
            "quantity" : 4,
            "_id" : ObjectId("581b7d650949a5204e0a6e9e")
        }
    ],
    "__v" : 0
},
{
    "_id" : ObjectId("581b7d650949a5204e0a6e9c"),
    "types" : [ 
        {
            "type" : ObjectId("581b7c645057c4602f48627f"),
            "quantity" : 4,
            "_id" : ObjectId("581b7d650949a5204e0a6e9e")
        }
    ],
    "__v" : 0
}

我想创建一个查询,它将返回所有类型数组ALL与数组中的$匹配的元素。

例如:

query([ObjectId("581b7c645057c4602f48627f"), ObjectId("581ca0e75b1e3058521a6d8c")])

应返回元素1和2

query([ObjectId("581b7c645057c4602f48627f")])

应返回元素2

query([ObjectId("581ca0e75b1e3058521a6d8c")])

应该什么都不返回

我试过

db.getCollection('elements').find({'types.type': { $in: [ObjectId("581ca0e75b1e3058521a6d8c")]}})

但如果只有一种类型匹配

,则返回元素

1 个答案:

答案 0 :(得分:1)

您可能必须使用聚合作为$ in,而$ elematch将仅返回匹配的元素。项目阶段设置等于创建一个全匹配标志,并在最后一个阶段匹配真值。

aggregate([ {
    $project: {
        _id: 0,
        isAllMatch: {$setIsSubset: ["$types.type", [ObjectId("581b7c645057c4602f48627f")]]},
        data: "$$ROOT"
    }
}, {
    $match: {
        isAllMatch: true
    }
}])

示例输出

{
    "isAllMatch": true,
    "data": {
        "_id": ObjectId("581b7d650949a5204e0a6e9c"),
        "types": [{
            "type": ObjectId("581b7c645057c4602f48627f"),
            "quantity": 4,
            "_id": ObjectId("581b7d650949a5204e0a6e9e")
        }],
        "__v": 0
    }
}

替代版本:

这个版本将项目和匹配阶段结合到一个带有$ cond运算符的$ redact阶段,以决定是保留还是修剪元素。

aggregate([{
    "$redact": {
        "$cond": [{
                $setIsSubset: ["$types.type", [ObjectId("581b7c645057c4602f48627f")]]
            },
            "$$KEEP",
            "$$PRUNE"
        ]
    }
}])