【问题标题】:Aggregate query runs in mongodb and not in mongoose聚合查询在 mongodb 中运行,而不在 mongoose 中运行
【发布时间】:2020-04-06 13:06:24
【问题描述】:

我有一个集合 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 添加的字段创建了一个 $match,但这会返回结果为 mongoDb 而不是 mongoose, 如何在 mongoose 中获得结果?谢谢。

猫鼬版本:^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 } },
]);

【问题讨论】:

  • 可以为成员添加成员架构代码和示例文档吗?
  • 上面的代码看起来不像是返回值或保存在任何变量中。

标签: node.js mongodb express mongoose aggregation-framework


【解决方案1】:

我可以像这样用猫鼬得到结果:

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);

【讨论】:

  • 感谢您的回复,它似乎是相同的架构和相同的查询,删除我在 myCollection 中的所有数据后它可以工作,
  • @user2285831 欢迎您,我想这回答了您的问题,请考虑将其标记为答案。
猜你喜欢
  • 2017-03-17
  • 1970-01-01
  • 2017-09-13
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 2010-12-14
相关资源
最近更新 更多