在两个小节中执行查询和抓取结果 mongodb



我正在使用猫鼬来处理我的数据库。

我有以下模型:

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 的记录和类型为 1second

最后,我们合并这些组并根据它们的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' } ] }

最新更新