我有一个模式为:
的集合{
_id: 521cc63c19752c562300001a,
author: 'John',
quote: 'A quote',
type: 1,
stars:
[{ _id: 521cc63c19752c562300001b,
user: 521cc63c19752c5623000003,
date: Tue Aug 27 2013 16:31:08 GMT+0100 (IST) }]
}
我正在尝试选择在特定数组中包含类型的文档。例如,如果类型是唯一的,则返回每种类型的三个引号,完全符合预期:
db.quotes.aggregate([
{$match: {
"type": {
$in: [1, 2, 3] //The unique types
}
}},
// Group by the type
{$group: {
_id: "$type",
id: { $first: "$_id" },
author: { $first: "$author" },
stars: { $first: "$stars" },
description: { $first: "$description" }
}},
// Map/project the first result of each group
// to their respective keys
{$project: {
_id: "$id",
type: "$_id",
author: "$author",
description: "$description"
stars: "$stars"
}}
]);
我的问题是类型可能并不总是唯一的。我可能必须找到三个具有相同类型([1,1,1])或两个相同和一个唯一([1,2,2])的文档。出现这种情况时,由于$ group by type pipeline命令,它只返回一个或两个结果。任何建议我如何提供三种非独特类型,并且每种类型总是得到三个报价?
答案 0 :(得分:0)
您需要编写自己的函数:
实例化一个空的 skipDocs 哈希/对象,例如
var objSkipDocs = {};
对于 types 数组的每个元素,将哈希值中的该键的键归零。
for(var i = 0; i< arrayTypes.length; i ++){ objSkipDocs [arrayTypes [i]] = 0; }
types 数组的每个元素都尝试获取文档,例如
db.quotes.findOne({'type':arrayTypes [i]})。skip(objSkipDocs [arrayTypes [i]]);
objSkipDocs [arrayTypes [i]] + = 1;
对检索到的文档执行某些操作