当revisions
是一个对象(键为entryId)时,我的聚合调用是有效的。
await Project.aggregate([
{ $limit: 1 },
{ $match: { _id: ObjectId(projectId) } },
{
$project: {
limits: 1,
revisions: { $slice: [`$revisions.${entryId}.${languageId}`, startIndex, PageSize] },
totalRevisions: {
$size: { $ifNull: [`$revisions.${entryId}.${languageId}`, []] },
},
},
},
]);
现在我已经将带有entryId的revisions
转换为数组,但我不确定如何获得相同的结果。我尝试过:
await Project.aggregate([
{ $limit: 1 },
{
$match: {
_id: ObjectId(projectId),
'revisions.entryId': ObjectId(entryId),
},
},
{
$project: {
limits: 1,
revisions: { $slice: [`$revisions.$.${languageId}`, startIndex, PageSize] },
totalRevisions: {
$size: { $ifNull: [`$revisions.$.${languageId}`, []] },
},
},
},
]);
但是我收到了这个错误消息:
MongoError: 字段名不能以 $ 开头。
怎样才能在数组中使用 $slice 和 $ifNull?谢谢。
样例文档:
{
"revisions" : [
{
"entryId" : ObjectId("5bbf8813c272e05171463bc4"),
"5bbe76c6d3fb1a4f143f8304" : [
{
"authorId" : ObjectId("5b1c5384d75d9f3b0eb65c2a"),
"revisionId" : ObjectId("5bbf8813c272e05171463bc7"),
"updated" : "2018-10-11T17:27:47.842Z",
"value" : "County"
}
]
}
]
}
$limit
,为什么要使用$match
无法理解!!!请同时发布示例文档和输出。 - Ashh