如何解决在一个请求中使用投影机内部的查找值
以下是我的数据示例:
{
"_id": ObjectId("5fa7d0e31abef4382b15efd0"),"users":
[
{
"_id": ObjectId("5fa667194f22083924eeca9e"),"messageId": ObjectId("5fa7d15a1abef4382b15efd2")
},{
"_id": ObjectId("5fa673a50af228412b0ccf2b"),"messageId": ObjectId("5fa7d15a1abef4382b15efd1")
}
],"messages":
[
{
"_id": ObjectId("5fa7d0e31abef4382b15efcf"),"message": "Hi!","userId": ObjectId("5fa667194f22083924eeca9e")
},{
"_id": ObjectId("5fa7d15a1abef4382b15efd1"),"message": "Hello!","userId": ObjectId("5fa673a50af228412b0ccf2b")
},{
"_id": ObjectId("5fa7d15a1abef4382b15efd2"),"message": "How are you?","userId": ObjectId("5fa667194f22083924eeca9e")
}
]
}
我尝试获取消息在“消息”数组中的位置,该消息由位于“用户”数组中的messageId确定。 这是我尝试过的:
db.chat.find({ 'users._id': ObjectId("5fa667194f22083924eeca9e") },{ 'users': 1,'index':
{
'$indexOfArray':
[
'$messages._id','$users.0.toRead'
]
},'messages.$': 1
})
我知道如果我使用它会起作用:
db.chat.find({ 'users._id': ObjectId("5fa667194f22083924eeca9e") },ObjectId("5fa7d15a1abef4382b15efd2")
]
},'messages.$': 1
})
但是我无法在发送请求之前猜测消息的ID,我只想发出一个请求,而没有批量请求。有可能这样做吗?我想为两个用户做此索引。我应该复制$ indexToArray两次还是有另一种方法?
解决方法
使用聚合框架确实可以实现所需的结果,因为您可以利用运算符$map
来映射用户数组,并在$mergeObjects
运算符中包括新的索引字段。您仍然可以使用$indexOfArray
运算符来获取消息ID的位置。当然,您需要执行$addFields
管道步骤来投影此新映射的users
字段和其他文档属性messages
。
以下管道演示了上述操作:
db.chat.aggregate([
{ '$match': { 'users._id': ObjectId("5fa667194f22083924eeca9e") } },{ '$addFields': {
'users': {
'$map': {
'input': '$users','as': 'u','in': {
'$mergeObjects': [
'$$u',{ 'index': {
'$indexOfArray': ['$messages._id','$$u.messageId']
} }
]
}
}
}
} }
])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。