我有一个集合,它在MongoDB数据库中存储孩子的出生日期和时间。用户可以创建一个时隙,并基于该用户可以在该特定时隙中生成子细节。例如,对于今天的用户选择,08:00 am-09:30 am,用户可以在屏幕上看到详细信息,这是我能够成功完成的。
我找不到孩子们在任何时间段都不摔倒的细节。例如,用户创建了4个时隙[08:00 am-09:30 am,11:00 am-12:00,2:30 pm-6:30 pm,09:00 pm-09:30 pm],我想获取不属于四个时隙中任何一个时隙的孩子的详细信息。
首先,我将检索slot集合中的插槽,然后从nodejs api迭代每个插槽,并将其发送到下面的代码并检索详细信息。

[
{ $match : {'BornTime': {$gte: start, $lte: end} } },
{ $project:{
"_id": 0,
"name":{$concat: [
        {$cond:[{ $eq: ['status', 1] }, "Children Born", ""]},
        {$cond:[{ $eq: ['status', 0] }, "Children Died", ""]},
        ]},
    "childcount":'childcount'}},

{ $group: { _id: '$name', count: { $sum: 1 } , covers: { $sum: '$childcount' } } },
]

请帮助我检索不属于任何槽的细节。我不能发布那个部分,因为我不能把它做对,或者我不知道如何实现它,我试着使用$not,但是没有成功。
请让我知道,如果需要进一步澄清以上任何细节。

最佳答案

我认为您的流程可以简化,并且可以立即得到您想要的结果,而无需像您所说的那样“迭代”。
假设我们使用问题中提到的四个时隙,我们正在寻找今天的结果。我会这样做,这将在一次点击中对结果进行分类:

var today = new Date("2015-08-11T00:00:00.000Z"),
    tomorrow = new Date("2015-08-12T00:00.000Z"),
    slots = [
      [new Date("2015-08-11T08:00:00.000Z"),new Date("2015-08-11T09:30:00.000Z")],
      [new Date("2015-08-11T11:00:00.000Z"),new Date("2015-08-11T12:00:00.000Z")],
      [new Date("2015-08-11T14:30:00.000Z"),new Date("2015-08-11T18:30:00.000Z")],
      [new Date("2015-08-11T21:00:00.000Z"),new Date("2015-08-11T21:30:00.000Z")]
    ];


var stack = [];

for (var i = slots.length-1; i >= 0; i--) {
  var rec = {
    "$cond": [
      { "$and": [
        { "$gte": [ "$BornTime", slots[i][0] ]},
        { "$lte": [ "$BornTime", slots[i][1] ]}
      ]},
      i
    ]
  };

  if ( stack.length == 0 ) {
    rec["$cond"].push("noSlot");
  } else {
    var lval = stack.pop();
    rec["$cond"].push(lval);
  }

  stack.push(rec);

}

var pipeline = [
    // Match today
    { "$match":{ "BornTime": { "$gte": today, "$lt": tomorrow } } },

    // Group
    { "$group": {
      "_id": {
        "name": {
          "$cond": [
            { "$eq": [ "$status", 1 ] },
            { "$literal": "ChildrenBorn" },
            { "$literal": "ChildrenDied" }
          ]
        },
        "slot": stack[0]
      },
      "count": { "$sum": 1 },
      "covers": { "$sum": "$childcount" }
    }}
];

在管道阶段为分组实际建立“slot”条目,如下所示:
{
  "$cond" : [
    {
      "$and" : [
        {
          "$gte" : [
            "$BornTime",
            ISODate("2015-08-11T08:00:00Z")
          ]
        },
        {
          "$lte" : [
            "$BornTime",
            ISODate("2015-08-11T09:30:00Z")
        ]}
      ]
    },
    0,
    {
      "$cond" : [
      {
        "$and" : [
          {
            "$gte" : [
              "$BornTime",
              ISODate("2015-08-11T11:00:00Z")
            ]
          },
          {
            "$lte" : [
              "$BornTime",
              ISODate("2015-08-11T12:00:00Z")
            ]
          }
        ]
      },
      1,
      {
        "$cond" : [
          {
            "$and" : [
              {
                 "$gte" : [
                   "$BornTime",
                   ISODate("2015-08-11T14:30:00Z")
                 ]
              },
              {
               "$lte" : [
                 "$BornTime",
                 ISODate("2015-08-11T18:30:00Z")
               ]
              }
            ]
          },
          2,
          {
            "$cond" : [
              {
                 "$and" : [
                    {
                      "$gte" : [
                        "$BornTime",
                        ISODate("2015-08-11T21:00:00Z")
                      ]
                    },
                    {
                      "$lte" : [
                        "$BornTime",
                        ISODate("2015-08-11T21:30:00Z")
                      ]
                    }
                  ]
              },
              3,
              "noSlot"
            ]
          }
        ]
      }
    ]
  }
]

}
因此,根据当前“borntime”值落在每个槽中的位置,返回每个“槽号”。如果它不属于任何插槽,则返回“noslot”值。
因此,在nested$cond的lttle帮助下,您可以在一个查询中获得所有结果。

09-25 18:19