gpt4 book ai didi

node.js - 具有 $lookup 聚合的多条件

转载 作者:可可西里 更新时间:2023-11-01 10:37:52 24 4
gpt4 key购买 nike

我正在考虑使用最佳实践来解决 Mongoose 的以下问题。

我有三个模式:

const SchemaA = new Schema({
name: String
});

const SchemaB = new Schema({
schemaA: {
type: Schema.Types.ObjectId,
ref: 'SchemaA',
required: true
}
});

const SchemaC = new Schema({
schemaB: {
type: Schema.Types.ObjectId,
ref: 'SchemaB'
},
user: {
type: Schema.Types.ObjectId,
ref: 'User'
}
});

我需要通过附加了 schemaC 的 schemaA id 获取 schemaB 对象,但由用户过滤。

getSchemaBs: async (schemaAId, userId) => {
try {
SchemaB.find({ schemaA: schemaAId }).populate('schemaC': where user === userId);
} catch (e) {
throw new Error('An error occurred while getting schemasB for specified schemaA.');
};

我正在重构使用 NodeJS 的 Mongo native 驱动程序编写的代码。现在我想使用 Mongoose 使其更简单。

早期版本的代码(请记住它不能遵循最佳实践):

getList: function (schemaAId, userId) {
return new Promise(
function (resolve, reject) {
db.collection('schemaB').aggregate([{
$match: {
'isDeleted': false,
'schemaA': ObjectID(schemaAId)
}
},
{
$lookup: {
from: "schemaC",
localField: "_id",
foreignField: "schemaBId",
as: "schemasC"
},
},
{
$project: {
_id: true,
schemaAId: true,
// other neccessary fields with true (several lines - makes code ugly and messy)
schemasC: {
"$arrayElemAt": [{
$filter: {
input: "$schamasC",
as: "schemaC",
cond: {
$eq: ["$$schemaC.userId", ObjectID(userId)]
}
}
}, 0]
}
}
}
]).toArray(function (error, result) {
if (error) {
reject(error);
} else {
resolve(result);
};
});
});
}

我怎样才能最好地处理这个问题?

最佳答案

使用 mongodb 3.6 可以更好地完成您正在尝试做的事情 $lookup$lookup 中过滤文档的语法流水线

db.collection('schemaB').aggregate([
{ "$match": { "isDeleted": false, "schemaA": ObjectID(schemaAId) }},
{ "$lookup": {
"from": "schemaC",
"let": { "schemaBId": "$_id" },
"pipeline": [
{ "$match": {
"$expr": { "$eq": ["$schemaBId", "$$schemaBId"] },
"userId": ObjectID("5b5c747d8209982630bbffe5")
}}
],
"as": "schemasC"
}}
])

关于node.js - 具有 $lookup 聚合的多条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53573605/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com