我的MongoDB中有很多组文档。在每个组文档中,有一组用户。此用户数组包含JSON对象,这些对象具有当前属于该组的用户的id值。
我在NodeJs中有一条接收ID的路由,这必须搜索所有组并将那些具有该ID的组返回到用户的数组中。
我该怎么做?这是对象的代码片段:
小组文件:
{
"_id" : ObjectId("59d946c2a92b6c0f48feef19"),
"title" : "Grupo",
"group_id" : "1",
"params" : [],
"users" : [
{
"api_id" : "1",
"_id" : ObjectId("59d946c2a92b6c0f48feef1a")
}
],
"__v" : 0
}
用户文档:
{
"_id" : ObjectId("59d9035f25691a373073f671"),
"api_id" : "0",
"user" : "",
"password" : "",
"params" : {
"name" : "Christian",
"phone" : "23453453345234234",
"firebase" : "KEY FOR FIREBASE GOES HERE"
},
"__v" : 0
}
我可以使用哪个查询来执行此操作?我只通过了api_id。我需要以JSONArray格式返回所有组,我可以很容易地做,但我需要知道如何搜索它。
答案 0 :(得分:1)
您可以使用mongodb aggregate
检查下面的代码,这将返回包含具有匹配的api_id
的用户的所有组db.parents.aggregate([{
$unwind: {
path: "$users"
}
},
{
$project: {
_id: 1,
title: 1,
group_id: 1,
user_id: "$users._id",
user_api_id: "$users.api_id",
params: 1
}
},
{
$match: { user_api_id: "<Place your api id here>" }
},
{
$group: {
_id: { _id: "$_id", group_id: "$group_id", title: "$title", user_api_id: "$user_api_id", params: "$params" }
}
},
{
$project: {
_id: "$_id._id",
params: "$_id.params",
group_id: "$_id.group_id",
title: "$_id.title",
user_api_id: "$_id.user_api_id"
}
}
])
快速解释:
$unwind
:此操作将展平用户数组,因此此操作的结果将是group
个文档列表,每个文档都包含单个用户
$project
:此操作将使您能够重命名文档字段,因此您不必在每个组文档中包含用户对象,而是在每个文档中都有一个名为user_id和user_api_id的字段。
$match
:此操作将根据特定字段过滤文档,在我们的示例中为user_api_id
$group
:此操作将使用相同的_id,group_id,title,user_api_id和params对所有文档进行分组,此分组仅用于避免重复文档...如果组文档包含多个文档,我们可能会获得重复的组文档1个用户具有相同的api_id
有关mongodb运算符的更多信息,请查看mongodb documentation
答案 1 :(得分:0)
我认为你可以使用聚合功能。请检查
db.collection.aggregate([
{
"$match": {
"users._id": ObjectId("59d946c2a92b6c0f48feef1a")
}
},
{
"$unwind": "$users"
},
{
"$project": {
"_id": 1,
"users": 1
}
}
])
另一种解决方案是elemMatch功能
model.find().elemMatch('users', {_id:"59d946c2a92b6c0f48feef1a"}).exec()
或
model.find({users:{$elemMatch:{_id:"59d946c2a92b6c0f48feef1a"}}}).exec()