代码之家  ›  专栏  ›  技术社区  ›  Code Reactor

如何在mongodb中使用查找对单个集合的文档执行相等匹配?

  •  0
  • Code Reactor  · 技术社区  · 8 年前

    我是MongoDB的新手,我正在尝试进行平等匹配,但一直未能做到这一点。我有一个“用户”集合,其中包含以下数据:

    {
      uid:"1230"
      age:20
      Name:"Alex"
      gender:"male"
      interestedIn:"female"
    }
    
    {
      uid:"1231"
      age:23
      Name:"Neil"
      gender:"male"
      interestedIn:"male"
    }
    
    {
      uid:"1232"
      age:20
      Name:"Amy"
      gender:"female"
      interestedIn:"male"
    }
    

    我想要的是找到“性别”等于当前用户“感兴趣”的记录,反之亦然。i、 e.当我作为用户“Alex”访问时,查询应该只提供“Amy”的记录(因为Amy的性别值等于Alex的“interestedIn”值),而不是Neil的记录。和

    当我作为用户“Neil”访问时,不应返回任何数据,因为没有任何男性用户以及对男性感兴趣的用户!

    我尝试使用$查找,但它根本不起作用。我很难使用$cond操作符来处理这个案件。这是我的代码:

    //我也在使用地理空间函数(通过对坐标进行硬编码),但这不是问题所在,没有返回任何内容。

    db.users.aggregate([{
    "$geoNear": {
      "near": {
        type: "Point",
        coordinates: [31.9686, 99.90]
      },
      "spherical": true,
      "distanceField": "distance",
      "maxDistance": 500,
      "query": {
        uid: {
          $ne: "1230"
        },
        age: {
          $gt: 18,
          $lt: 25
        },
      {
        $lookup:
        {
          from: "users",
          localField: "gender",
          foreignField: "interestedIn",
          as: "gender_docs"
        }
      },
      limit: 5
    }  
    },
       {
            "$project": {
              location: 0
            }
          }
        ]).pretty()
    

    有人能告诉我该怎么做吗?

    //当前用户为Alex时的预期输出

     {
      uid:"1232"
      age:20
      Name:"Amy"
      gender:"female"
      interestedIn:"male"
    }
    

    当当前用户为Neil时,我的预期输出应该为空,因为没有任何其他性别为男性且感兴趣的记录为男性!

    1 回复  |  直到 8 年前
        1
  •  1
  •   mikezter    8 年前

    您不需要聚合框架 $lookup 在这里我希望您具有当前用户的属性(例如。 interestedIn )在应用程序中显示。

    您的问题的简单查询如下:

    db.users.find({
        "gender": currentUserInterestedIn, 
        "_id": { "$ne": currentUserID },
        "location": "$near": {
            "type": "Point",
            "coordinates": [currentUserLat, currentUserLong],
            "$maxDistance": 500    
        },
    }) 
    

    哪里 currentUserInterestedIn 应为当前用户兴趣的实际值,即。 "male" "female"

    这假定用户位置存储在名为 location