如何在 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
.
- 然后
$group
由 medicationStage
。这将创建一个嵌套数组(因为 $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
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
. - 然后
$group
由medicationStage
。这将创建一个嵌套数组(因为$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