猫鼬查找然后返回带有条件的子文档

时间:2019-05-16 08:06:21

标签: mongodb mongoose mongodb-query

我有以下数据

{
    "_id" : ObjectId("5cdcb640e6d43d2c91e432aa"),
    "userID" : "quqrgfbf43adadonadb",
    "taggedProducts" : [ 
        {
            "isChecked" : true,
            "_id" : ObjectId("5cdcb640e6d43d2c91e432ab"),
            "catalogSKU" : "MYLOAD 10",
            "createdBy" : "string",
            "modifiedBy" : "string",
            "remarks" : "string",
            "createdAt" : ISODate("2019-05-16T01:00:48.852Z"),
            "updatedAt" : ISODate("2019-05-16T01:00:48.852Z")
        }, 
        {
            "isChecked" : false,
            "_id" : ObjectId("5cdcb675e6d43d2c91e432ac"),
            "catalogSKU" : "MYLOAD 11",
            "createdBy" : "string",
            "modifiedBy" : "string",
            "remarks" : "string",
            "updatedAt" : ISODate("2019-05-16T01:01:41.450Z"),
            "createdAt" : ISODate("2019-05-16T01:01:41.450Z")
        }, 
        {
            "isChecked" : true,
            "_id" : ObjectId("5cdcd76b61d09c0cdd6fafdd"),
            "catalogSKU" : "MYLOAD 12",
            "createdBy" : "string",
            "modifiedBy" : "string",
            "remarks" : "string",
            "updatedAt" : ISODate("2019-05-16T03:22:19.525Z"),
            "createdAt" : ISODate("2019-05-16T03:22:19.525Z")
        }
    ],
    "__v" : 0
}

目标:需要使用用户ID查找文档,然后用"taggedProducts"返回所有isChecked: true

我曾尝试过许多与此相关的文章,但是首先没有使用.find的代码。建议是使用.aggregate

我也尝试使用$elemMatch,但它只返回符合条件的第一个子文档。

谁能建议该怎么做?

1 个答案:

答案 0 :(得分:1)

在这种情况下,您不能使用$elemMatch (projection),因为它只会返回 first 匹配元素。因此,您需要$filter作为聚合的一部分:

db.collection.aggregate([
    {
        $match: { userID: "quqrgfbf43adadonadb" }
    },
    {
        $addFields: {
            taggedProducts: {
                $filter: {
                    input: "$taggedProducts",
                    cond: {
                        $eq: [ "$$this.isChecked", true ]
                    }
                }
            }
        }
    }
])

Mongo playground