Совокупный запрос выполняется в mongodb, а не в mongoose - PullRequest
1 голос
/ 06 апреля 2020

У меня есть коллекция myCollection с массивом членов и количеством мест:

{
   name : String,
   members: [{status : Number, memberId : {type: Schema.Types.ObjectId, ref: 'members'}],
   nbPlaces : Number
}

, и у меня есть эти данные

"_id" : ObjectId("5e83791eb49ab07a48e0282b")
   "members" : [ 
        {
            "status" : 1,
            "_id" : ObjectId("5e83791eb49ab07a48e0282c"),
            "memberId" : ObjectId("5e7dbf5b257e6b18a62f2da9")
        }, 
        {
            "status" : 2,
            "_id" : ObjectId("5e837944b49ab07a48e0282d"),
            "memberId" : ObjectId("5e7de2dbe027f43adf678db8")
        }
    ],
  "nbPlaces": 5

Я делаю $ матч с полем, добавленным $ addFields , но это возвращает результаты в mongoDb, а не в mon goose. Как я могу получить результаты в mon goose? спасибо.

пн goose версия: ^ 5.9.4 "

myCollection.aggregate([
  {
    $project: {
      nbMembers: {
        $size: {
          $filter: {
            input: "$members",
            as: "member",
            cond: { $eq: ["$$member.status", 1] },
          },
        },
      },

      nbPlaces: 1,
    },
  },
  {
    $addFields: {
      charged: {
        $cond: {
          if: { $eq: [{ $subtract: ["$nbPlaces", "$nbMembers"] }, 0] },
          then: true,
          else: false,
        },
      },
    },
  },
  { $match: { _id: ObjectId("5e83791eb49ab07a48e0282b"), charged: false } },
]);

1 Ответ

1 голос
/ 06 апреля 2020

Я могу получить результат с mon goose следующим образом:

const mongoose = require("mongoose");
const ObjectId = mongoose.Types.ObjectId;

router.get("/test", async (req, res) => {
  const result = await myCollection.aggregate([
    {
      $project: {
        nbMembers: {
          $size: {
            $filter: {
              input: "$members",
              as: "member",
              cond: { $eq: ["$$member.status", 1] },
            },
          },
        },
        nbPlaces: 1,
      },
    },
    {
      $addFields: {
        charged: {
          $cond: {
            if: { $eq: [{ $subtract: ["$nbPlaces", "$nbMembers"] }, 0] },
            then: true,
            else: false,
          },
        },
      },
    },
    { $match: { _id: ObjectId("5e83791eb49ab07a48e0282b"), charged: false } },
  ]);

  res.send(result);
});

Что дает этот результат:

[
    {
        "_id": "5e83791eb49ab07a48e0282b",
        "nbPlaces": 5,
        "nbMembers": 1,
        "charged": false
    }
]

Проверьте, соответствует ли ваша схема myCollection вашим данным, я использовал это:

const mongoose = require("mongoose");

const schema = new mongoose.Schema({
  name: String,
  members: [
    {
      status: Number,
      memberId: { type: mongoose.Schema.Types.ObjectId, ref: "members" },
    },
  ],
  nbPlaces: Number,
});

module.exports = mongoose.model("myCollection", schema);
...