javascript - 动态更改 MongoDB 查找结果

标签 javascript node.js mongodb mongoose

我将 mongoose 与 node.js 一起使用。

假设我有“帖子”数据库,其中每个文档都是一篇帖子。 每个帖子都有一个“ReadBy”数组,其中保存已阅读该帖子的用户的姓名。

当我在此数据库中搜索文档时,我想“更改”“ReadBy”值以通过 bool 值显示正在搜索的用户是否在此数组中。

例如,假设此数据库中有 2 个文档:

{ "PostName": "Post Number 1", "ReadBy": ["Tom", "John", "Adam"] }
{ "PostName": "Post Number 2", "ReadBy": ["John", "Adam"] }

如果我是用户“Tom”,我想得到这样的结果:

[
    {
        "PostName": "Post Number 1",
        "ReadBy": true,
    },
    {
        "PostName": "Post Number 2",
        "ReadBy": false,
    }
]

现在,我知道我可以获取文档并使用 forEach 函数遍历每个文档,然后在“ReadBy”数组上再次使用 forEach 并更改此字段。

我问是否有更有效的方法在 mongoDB 查询本身中或代码中以其他方式执行此操作。

如果 Mongoose 有另一种方法 - 那就更好了。

最佳答案

使用 mongoDb $setIntersection 聚合中你会得到这样的结果:

db.collectionName.aggregate({
"$project": {
    "ReadBy": {
        "$cond": {
            "if": {
                "$eq": [{
                        "$setIntersection": ["$ReadBy", ["Tom"]]
                    },
                    ["Tom"]
                ]
            },
            "then": true,
            "else": false
        }
    },
    "PostName": 1
}
})

所以上面首先像这样工作

{ $setIntersection: [ [ "Tom", "John", "Adam"], [ "Tom"] ] },  return [ "Tom"]

{ $setIntersection: [ [ "John", "Adam"], [ "Tom"] ] },  return [ ]

$eq检查 setIntersection 结果是否与 ["Tom"] 匹配,如果匹配则返回 true 否则 false

关于javascript - 动态更改 MongoDB 查找结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32099331/

相关文章:

php - POST 文本数据和文件

javascript - AWS API Gateway Websocket Api - 向所有连接的客户端广播消息

javascript - 如何使用JavaScript中的函数转换温度

Javascript:将函数指针放入对象中?

angularjs - npm install - Windows 中的 g generator-gulp-angular 错误

java - 使用 MongoDb 进行 Elasticsearch

javascript - 如何检测 contenteditable div 内的 HTML 更改?

javascript - 当我尝试发出更新请求时,无法在将 header 发送到客户端后设置 header

MongoDB 对匹配所有值的电子邮件地址的全文搜索和可能的修复比较耗时太多

node.js - 使用 Mongoose 更新子文档