javascript - 在聚合管道$eq diff值中查询嵌入文档的mongo数组
问题描述
我有一系列 mogoDB 嵌入式文档
const ArticleSchema = new mongoose.Schema({
title: { type: String, required: true },
author: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true },
group: { type: mongoose.Schema.Types.ObjectId, ref: "ArticleGroup" },
});
// ArticleGroup
const ArticleGroupSchema = new mongoose.Schema({
name: { type: String, required: true },
desc: { type: String, default: "" },
state: { type: String, required: true, default: "public" },
members: [
{
desc: String,
role: String,
user: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true },
},
],
});
// User
const userSchema = new mongoose.Schema(
{
email: { type: String, unique: true },
password: String,
},
);
测试数据 :
{
_id: "6131aa5b367318e2df14b988",
title: "功能更新清单",
author: ObjectId("607edeb4b1e1bea9acb5af38"),
group: ObjectId("612d00a43c52975d4ade10d4")
}
我想通过比较“author._id == group.members”向文档中添加一个新字段“can_edit”。“聚合”管道中的用户。
Article.aggregate([
{
$lookup: {
from: "users",
localField: "author",
foreignField: "_id",
as: "author",
},
},
{
$lookup: {
from: "articlegroups",
localField: "group",
foreignField: "_id",
as: "group"
}
},
{
$addFields: {
can_edit: {
$eq: ["$group.members.user", "$author._id"],
},
}
}
])
但是,我得到的'can_edit'始终是'false',并且我确信我的测试数据中的'author._id'值与'group.members'相同。
我要获取数据:</p>
{
_id: "6131aa5b367318e2df14b988",
can_edit: true,
title: "功能更新清单",
author: {
_id: "607edeb4b1e1bea9acb5af38",
email: "frmachao@126.com",
},
group: {
_id: "612d00a43c52975d4ade10d4",
desc: "开发",
state: "public",
name: "开发小组",
members: [
{
_id: "612d00a43c52975d4ade10d5",
role: "admin",
user: "607edeb4b1e1bea9acb5af38",
}
]
}
}
有什么方法可以满足我的需求吗?有谁知道这是怎么做到的吗?我会很感激你的。
刚才,我尝试:
Article.aggregate([
{
$lookup: {
from: "users",
localField: "author",
foreignField: "_id",
as: "author",
},
},
{
$lookup: {
from: "articlegroups",
localField: "group",
foreignField: "_id",
as: "group"
}
},
{
$addFields: {
can_edit: {
$in: [
"$author._id",
"$group.members.user"
],
},
},
}
])
但是,我得到的“can_edit”总是“假”
解决方案
返回一个布尔值,指示指定的值是否在数组中。
$in: [
"$author._id",
"$group.members.user"
]
更新:
由于 Post Owner 添加了问题:
$in 需要一个数组作为第二个参数
这意味着$group.members
可能是 null 而不是数组。
为检查添加条件检查$group.members
必须是一个数组。
{
case: {
$ne: [
{
"$type": "$group.members"
},
"array"
]
},
then: false
},
$ne
- 不等于检查
$type
- 返回 BSON 类型的字段
完整查询:
db.collection.aggregate([
{
$addFields: {
can_edit: {
$switch: {
branches: [
{
case: {
$ne: [
{
"$type": "$group.members"
},
"array"
]
},
then: false
},
{
case: {
$ne: [
{
"$type": "$group.members"
},
"array"
]
},
then: false
},
{
case: {
$in: [
"$author._id",
"$group.members.user"
]
},
then: true
}
],
default: false
}
}
}
}
])
或者,可以缩短查询$switch
而不需要$in
返回相同的布尔结果。
$and
- 多个表达式的逻辑与
完整查询:
db.collection.aggregate([
{
$addFields: {
can_edit: {
$and: [
{
$eq: [
{
"$type": "$group.members"
},
"array"
]
},
{
$in: [
"$author._id",
"$group.members.user"
]
}
]
}
}
}
])
推荐阅读
- sql - Oracle 外部加载器 - 加载双引号
- java - 我们如何在保持所有结果的同时组成 3 个或更多的可完成期货
- php - 我可以将图像传递给数组而不是字体真棒吗?
- datagridview - 在不启动 Excel 程序的情况下从 Excel 导入 Visual Basic
- java - 如何为特定请求仅指定一个过滤器?
- arrays - Bash 中的嵌套数组来自分离的数组值的集合
- javascript - 如何通过 Javascript 中的 Google Calendar API 获取 Google Calendar 中事件的位置?
- database - 将大文件上传到 AWS 数据库
- java - osx shell 生成的 base64 无法从 Java 中解码
- javascript - 拖动项目时如何自定义 SortableJS 插件上的光标