gpt4 book ai didi

mongodb - 当指定值在数组中时,将字段( bool 值)添加到返回的对象,而不包括数组本身

转载 作者:可可西里 更新时间:2023-11-01 10:42:44 25 4
gpt4 key购买 nike

我有一个看起来像这样的 Mongoose 模式:

var AnswerSchema = new Schema({
author: {type: Schema.Types.ObjectId, ref: 'User'},
likes: [{type: Schema.Types.ObjectId, ref: 'User'}]
text: String,
....
});

我有一个 API 端点,允许获取特定用户发布的答案(不包括 likes 数组)。我想要做的是在特定 user_id 在(或不在)likes 答案数组。这样,我可以向请求答案的用户显示他是否喜欢某个答案。

我怎样才能以优化的方式实现这一点?我想避免获取 likes 数组,然后在我的 Javascript 代码中自己查看它以检查其中是否存在指定的 userId,然后在将其发送回客户端之前将其删除......因为获取所有这些听起来是错误的从 mongoDB 到我的节点应用程序的数据是免费的。我确信使用聚合有更好的方法,但我从未使用过它并且对如何正确地做它有点困惑。数据库可能会变得非常大,因此它必须快速且经过优化。

最佳答案

您可以采用的一种方法是通过聚合框架,它允许您通过 $project 添加/修改字段 管道,应用大量逻辑运算符,这些运算符协同工作以实现所需的最终结果。例如,在您的上述情况下,这将转化为:

Answer.aggregate()
.project({
"author": 1,
"matched": {
"$eq": [
{
"$size": {
"$ifNull": [
{ "$setIntersection": [ "$likes", [userId] ] },
[]
]
}
},
1
]
}
})
.exec(function (err, docs){
console.log(docs);
})

作为在 mongo shell 中进行测试的示例,让我们向测试集合中插入一些测试文档:

db.test.insert([
{
"likes": [1, 2, 3]
},
{
"likes": [3, 2]
},
{
"likes": null
},
{
"another": "foo"
}
])

在测试集合上运行上述聚合管道以获取 userId = 2 的 bool 字段:

var userId = 2;
db.test.aggregate([
{
"$project": {
"matched": {
"$eq": [
{
"$size": {
"$ifNull": [
{ "$setIntersection": [ "$likes", [userId] ] },
[]
]
}
},
1
]
}
}
}
])

给出以下输出:

{
"result" : [
{
"_id" : ObjectId("564f487c7d3c273d063cd21e"),
"matched" : true
},
{
"_id" : ObjectId("564f487c7d3c273d063cd21f"),
"matched" : true
},
{
"_id" : ObjectId("564f487c7d3c273d063cd220"),
"matched" : false
},
{
"_id" : ObjectId("564f487c7d3c273d063cd221"),
"matched" : false
}
],
"ok" : 1
}

关于mongodb - 当指定值在数组中时,将字段( bool 值)添加到返回的对象,而不包括数组本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33831100/

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