如何在 mongo 数据库聚合管道中查询数组中某个元素的出现

How to query for the occurrence of an element in the array in mongo DB aggregation pipeline

I'm using mongoose to connect to Mongo DB.

起初这是我的架构:

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const TestSchema = new Schema({
  story: String,
  seenByUser: [String],
  medicationStage: {
    type: String,
    enum: [
      "no-medication",
      "just-after-medication",
      "towards-end-of-medication",
    ],
    required: true,
  },
});

// Compile model from schema
const TestModel = mongoose.model("Test", TestSchema);

module.exports = {
  Test: TestModel,
};

在这里你可以看到我有一个名为 seenByUser 的字段,它是一个字符串数组,是一个用户名数组。我正在设置一个数据聚合管道,我想在其中查看给定的用户名 获取该用户名 不存在的所有文档 seenByUser 数组中。按 medicationStage 分组。我无法创建此管道。请帮帮我。

如果我理解正确,你可以试试这个聚合:

  • 首先$match不存在yourValue进入数组seenByUser.
  • 然后 $groupmedicationStage。这将创建一个嵌套数组(因为 $push 添加整个数组)
  • $project使用$reduce并展平数组。
db.collection.aggregate({
  "$match": {
    "seenByUser": {
      "$ne": yourValue
    }
  }
},
{
  "$group": {
    "_id": "$medicationStage",
    "seenByUser": {
      "$push": "$seenByUser"
    }
  }
},
{
  "$project": {
    "_id": 0,
    "medicationStage": "$_id",
    "seenByUser": {
      "$reduce": {
        "input": "$seenByUser",
        "initialValue": [],
        "in": {
          "$concatArrays": [
            "$$value",
            "$$this"
          ]
        }
      }
    }
  }
})

示例here