【问题标题】:Mongodb: FindOne only those objects of array which match the condition in mongodbMongodb:仅FindOne那些与mongodb中的条件匹配的数组对象
【发布时间】:2019-12-03 21:03:51
【问题描述】:

我有一个收藏。我只想获取 user_surveys 数组中 survey_delete_flag 为 0 的那些对象

  {
       "_id":"5d38395531335242147f9341",
       "user_status":"Active",
       "user_surveys":[
          {
             "survey_id":"1563965898505",
             "survey_name":"Deepak Survey",
             "survey_delete_flag":0,
             "survey_status":"Active"
          },
          {
             "survey_id":"1563971438976",
             "survey_name":"Infra Survey",
             "survey_delete_flag":0,
             "survey_status":"Active"
          },
          {
             "survey_id":"1564059777417",
             "survey_name":"Infra2 Survey",
             "survey_delete_flag":1,
             "survey_status":"Active"
          }
        ]
    }

我正在使用 mongodb npm 库并尝试如下,但它只返回与 _id 匹配的所有文档。

  let query = {_id: new objectId(authenication.loggedUser.user_id)}
    let subquery= {user_surveys: {$elemMatch: {survey_delete_flag:0}}}
    survey_db.collection('user_registration').findOne(query,subquery,(err, 
   doc) => {
                if (!err) {
                    console.log(doc)
                    res.json({ res: doc.user_surveys })
                } else {
                    return res.json({ err: err })
                }
     }

我期待这样的结果

[
   {
      "survey_id":"1563965898505",
      "survey_name":"Deepak Survey",
      "survey_delete_flag":0,
      "survey_status":"Active"
   },
   {
      "survey_id":"1563971438976",
      "survey_name":"Infra Survey",
      "survey_delete_flag":0,
      "survey_status":"Active"
   }
]

【问题讨论】:

    标签: node.js mongodb express


    【解决方案1】:
    db.getCollection("user_registration").aggregate(
    
        // Pipeline
        [
            // Stage 1
            {
                $project: {
                    user_surveys: {
                        $filter: {
                            input: "$user_surveys",
                            as: "survey",
                            cond: {
                                $eq: ["$$survey.survey_delete_flag", 0]
                            }
                        }
                    }
    
                }
            },
    
        ]
    
    
    
    );
    

    【讨论】:

    • 嗨@Rubin!!需要您注意这个 stackoverflow.com/questions/68342140
    【解决方案2】:

    使用普通的 findOne,您无法以您想要的方式获得结果。为此,您必须使用聚合。

    像这样

    const query = [
        {
            $match: { _id:new objectId(authenication.loggedUser.user_id) }
        },
        {
            $unwind: "$user_surveys"
        },
        {
            $match: { "user_surveys.survey_delete_flag": 0 }
        },
        {
            $replaceRoot: { newRoot: "$user_surveys" }
        }
    ]
    
    survey_db.collection('user_registration').aggregate(query,(err,  doc) => {
        if (!err) {
            console.log(doc)
            res.json({ res: doc.user_surveys })
        } else {
            return res.json({ err: err })
        }
    })
    

    更多帮助请参考:https://docs.mongodb.com/manual/reference/method/db.collection.aggregate/

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-22
    • 2015-10-30
    • 2013-11-06
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 2022-07-10
    • 1970-01-01
    相关资源
    最近更新 更多