我有以下收藏:
"campaign": [{
"_id": "5b06c3f99b7997436714b230",
"recipients": [
{
"individual": "5a7075e8b36da12a64dc20ca",
"_id": "5b06cce20f93e2216cf5c189",
"sent": false
},
{
"individual": "5a7075e8b36da12a64dc20d6",
"_id": "5b06cce20f93e2216cf5c18a",
"sent": true
}
]
}]
我在使用标准查找查询来查找send = false / true的项目时遇到了麻烦,因此选择了汇总。
model.aggregate(
{
$addFields: {
"recipients": {
$filter: { // We override the existing field!
input: "$recipients",
as: "recipients",
cond: { $eq: ["$$recipients.sent", true] }
}
}
}
},
{
$lookup: {
from: 'registrations',
localField: 'recipients.individual',
foreignField: '_id',
as: 'recipients.individual'
}
}
)
不幸的是,这导致:
"campaign": [{
"_id": "5b06c3f99b7997436714b230",
"recipients": {
"individual": [
{
"_id": "5a7075e8b36da12a64dc20ca",
...
...
"registrationDate": "2012-01-08T00:00:00.000Z"
},
{
"_id": "5a7075e8b36da12a64dc20d6",
...
...
"registrationDate": "2012-01-06T00:00:00.000Z"
}
]
}
}]
代替必需的:
"campaign": [
{
"_id": "5b06c3f99b7997436714b230",
"recipients": [
{
"individual": {
"_id": "5a7075e8b36da12a64dc20ca",
...
...
"registrationDate": "2012-01-08T00:00:00.000Z"
},
"_id": "5b06cce20f93e2216cf5c189",
"sent": false
},
{
"individual": {
"_id": "5a7075e8b36da12a64dc20d6",
...
...
"registrationDate": "2012-01-06T00:00:00.000Z"
},
"_id": "5b06cce20f93e2216cf5c18a",
"sent": true
}
]
}]
关于另一个注意事项,就像我提到的那样,我尝试运行常规查找,以下是一些方法,这些方法基本上返回了所有数据,并且未按预期进行过滤。如果您能解释为什么我会很感激。
db.campaigns.find( { "recipients": { $elemMatch: { sent: false} } } )
db.campaigns.find( { "recipients.sent": {$ne: true} } )
db.campaigns.find({$or:[{"recipients.sent":false},{"recipients.sent":{$exists:false}}]})
db.campaigns.find({"recipients.sent": {$in: [null, false]}})
嘿@Veeram,感谢您在这里为我提供的帮助...为了使其正常工作,我必须进行一些调整,因为您手边没有所有的代码/模型,对您来说也没有错。
这是我想出的:
model.aggregate(
// {$match: {"campaign.id": campaignId}},
{
$unwind: {
path: '$recipients',
includeArrayIndex: 'arrayIndex',
preserveNullAndEmptyArrays: false
}
}, {
$match: {
'recipients.sent': {
$eq: true
}
}
}, {
$sort: {
total: -1
}
}, {
$limit: 5
}, {
$lookup: {
from: 'registrations',
localField: 'recipients.individual',
foreignField: '_id',
as: 'recipients.individual'
}
}, {
$group: {
_id: '$_id',
recipients: {
$push: '$recipients'
},
total: {
$sum: 1
}
}
}
)
这似乎可以解决问题。
现在唯一的另一件事是,我只想包含“个人”的某些属性,例如姓名和电子邮件地址。
非常感谢您的帮助。