我有以下数据
{
"_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
,但它只返回符合条件的第一个子文档。
谁能建议该怎么做?
答案 0 :(得分:1)
在这种情况下,您不能使用$elemMatch (projection),因为它只会返回 first 匹配元素。因此,您需要$filter作为聚合的一部分:
db.collection.aggregate([
{
$match: { userID: "quqrgfbf43adadonadb" }
},
{
$addFields: {
taggedProducts: {
$filter: {
input: "$taggedProducts",
cond: {
$eq: [ "$$this.isChecked", true ]
}
}
}
}
}
])