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

2024-02-18

我有一个猫鼬架构,如下所示:

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

我有一个 API 端点,允许获取特定用户发布的答案(不包括likes大批)。我想要做的是将一个字段(例如“true/false”值)添加到 mongoose 查询返回的答案中,当特定的 user_id 存在(或不在)时likes答案数组。这样,我可以向请求答案的用户显示他是否已经喜欢某个答案。

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


您可以采取的一种方法是通过聚合框架,它允许您通过以下方式添加/修改字段$project https://docs.mongodb.org/manual/reference/operator/aggregation/project/#pipe._S_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 的布尔字段:

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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当指定值在数组中时,将字段(布尔值)添加到返回的对象,但不包括数组本身 的相关文章

随机推荐