根据数组中的值返回整个MongoDB文档

时间:2017-10-07 21:42:24

标签: node.js mongodb mongoose

我的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格式返回所有组,我可以很容易地做,但我需要知道如何搜索它。

2 个答案:

答案 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()