我将 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/