我正在使用猫鼬来处理我的数据库。
我有以下模型:
var DeviceSchema = mongoose.Schema({
type: Number,
pushId: String
});
type 属性可以是 0 或 1。
我想执行一个查询,该查询获取所有文档并按以下格式检索结果:
{
fstType: [
{
_id: "545d533e2c21b900000ad234",
type: 0,
pushId: "123"
},
{
_id: "545d533e2c21b900000ad235",
type: 0,
pushId: "124"
},
],
sndType: [
{
_id: "545d533e2c21b900000ad236",
type: 1,
pushId: "125"
},
{
_id: "545d533e2c21b900000ad237",
type: 1,
pushId: "126"
},
]
}
这可能吗?我想在一个查询中做到这一点。
谢谢。
这可能吗?我想在一个查询中做到这一点。
是的。这是可能的。可以通过以下aggregation
管道操作实现所需的结果。
- 按升序排列
type
参数Sort
。 -
Group
记录在一起具有相同的type
,构造一个数组每个组的文档。在此阶段之后,将只有两个记录存在,每个属性都有一个名为items
的属性,它是一个数组每个组的记录。 - 由于我们的记录是按
type
排序的,因此first
组将包含类型为0
的记录和类型为1
的second
。
最后,我们合并这些组并根据它们的type
给每个组一个名称。
var model = mongoose.model('collection',DeviceSchema);
model.aggregate([
{$sort:{"type":-1}},
{$group:{"_id":"$type",
"items":{$push:"$$ROOT"},
"type":{$first:"$type"}}},
{$project:{"items":{$cond:[{$eq:["$type",0]},
{"firstType":"$items"},
{"secondType":"$items"}]}}},
{$group:{"_id":null,
"firstType":{$first:"$items.firstType"},
"secondType":{$last:"$items.secondType"}}},
{$project:{"_id":0,"firstType":1,"secondType":1}}
], function (err, result) {
if (err) {
console.log(err);
return;
}
console.log(result);
});
o/p:
{ firstType:
[ { _id: '545d533e2c21b900000ad234', type: 0, pushId: '123' },
{ _id: '545d533e2c21b900000ad235', type: 0, pushId: '124' } ],
secondType:
[ { _id: '545d533e2c21b900000ad236', type: 1, pushId: '125' },
{ _id: '545d533e2c21b900000ad237', type: 1, pushId: '126' } ] }