我有以下数据
{
"_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 ]
}
}
}
}
}
])
关于mongodb - Mongoose 找到然后返回带有条件的子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56163770/