mongodb - Mongoose 找到然后返回带有条件的子文档

标签 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 但它只返回符合条件的第一个子文档。

谁能建议怎么做?

最佳答案

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

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

Mongo playground

关于mongodb - Mongoose 找到然后返回带有条件的子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56163770/

相关文章:

javascript - 为什么 Meteor 集合没有在第一次 render() 时填充?

node.js - Mongoose Populate Virtuals 不起作用并返回 null

node.js - 如果未找到 ID,Mongoose 更新文档或插入新文档(Express REST API)

java - MongoDB 使用 $or 查找具有多个查询字段的查询

node.js - MongoDB 如何捕获deleteMany中的错误

mongodb - org.bson.codecs.configuration.CodecConfigurationException : Can't find a codec for class org. springframework.data.mongodb.core.query.GeoCommand

Mongodb 对内部数组进行排序

node.js - Model.find({_id :req. body.id}) 找到该对象,但 Model.updateOne({_id :req. body.id},{//update}) 未找到该对象

MongoDB 聚合 - 不同计数特定元素

mongodb - 获取 MongoDB 聚合管道中 $group 之后的输入文档中的字段