编写查询并从节点js和mongoose

时间:2016-07-05 18:49:40

标签: javascript node.js mongodb mongoose

我在节点js中编写一个查询,我的模型模型有3个对象(userid,tokenid,mediaid),我想找到某个用户标识的标记ID并在另一个函数中使用它。 我的代码如下:

app.get('/registeruser/:userid', function(req, res){
var name = req.params.userid;
    user.findOne({userid: name},function(err, users1){

    if(!users1){
        res.send('Error 404, user not found');
        return res.status(404).send();  
    }
    else{
        var query = user.find({tokenid: 1});
        query.where({userid: name});
        query.exec(function(err, result){
        if(err){
            res.send('erooooooor')
            }
        else{
            res.send('okk')
            console.log(result)}
        });

user是我的模型的名称。 我运行我的代码,我希望它返回tokenid,但它返回:[]

在我的数据库中使用这些:

userid:'hgfj1234', tokenid:'juiodkdn12345678', mediaid:['med10','med11']

当我写userid:'hgfj1234'它给了我这个:[]但是我想要真正的tokenid。

如果有人能帮助我,我真的很感激。

提前感谢。

2 个答案:

答案 0 :(得分:3)

您无需另外请求从mongodb获取记录。

这足以使用具有复杂属性的findOne。

试试这个:

app.get('/registeruser/:userid', function(req, res) {

    var query = {
      userid: req.params.userid,
      tokenid: {$exists: true, $not: {$size: 0}}
    };

    user
      .findOne(query)
      .exec(function(err, User) {

        if(err) { // error happen,
          console.error(err); // log error
          return res.status(500).send({
            success: false,
            message: 'System error'
          }); // respond with 500 status and send json response with success false and message. return will stop execution to go down
        }

        if(!User) { // response from database was empty or null
          return res.status(404).send({
            success: false,
            message: 'User not found'
          }); // respond with 404 status and send json response with success false and message. return will stop execution to go down
        }

        res.send({
          success: true,
          tokenid: User.tokenid
        }); // and at last everything is ok, we return json response with success and tokenid in response

      });
});



query变量中的属性意味着请求mongodb为我们提供在请求中定义userid的文档,其中tokenid已定义,而不是空字符串(不是大小为0)。

如果你仍然没有得到理想的结果,那么检查数据库是否存在必要的文件。

答案 1 :(得分:2)

如果我理解您的查询,您将减少find()tokenid1次来电find()。如果用户拥有令牌" 1"。

,您将只收到任何结果

我怀疑你想编码投影,这是var query = user.find({"userid": name}); query.select({"tokenid": 1}) .exec(function(err, result){ if(err){ res.send('erooooooor') } else{ res.send('okk') console.log(result)} }); 上的第二个参数:

    var viewer = new Cesium.Viewer('cesiumContainer');
var handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);
handler.setInputAction(function(click) {
    var alertText = '';
    function addToMessage(key, value) {
        alertText += key + ': ' + value + '\n';
    }

  //  var pickedObject = scene.pick(click.position);

       // addToMessage('target', pickedObject.id.id);
        var position = viewer.camera.pickEllipsoid(click.position);
        addToMessage('screenX', click.position.x);
        addToMessage('screenY', click.position.y);
        addToMessage('didHitGlobe', Cesium.defined(position));
        var cartographicPosition = Cesium.Ellipsoid.WGS84.cartesianToCartographic(position);
        addToMessage('longitude', cartographicPosition.longitude);
        addToMessage('latitude', Cesium.Math.toDegrees(cartographicPosition.latitude));
        terrainSamplePositions = [cartographicPosition];
        Cesium.sampleTerrain(viewer.terrainProvider, 9, terrainSamplePositions).then(function() {
            addToMessage('height', terrainSamplePositions[0].height);
        }).always(function() {
          //  alert(alertText);
        });

   // var x=Cesium.Math.toDegrees(cartographicPosition.latitude);
  //  var y=Cesium.Math.toDegrees(cartographicPosition.longitude);
     var y=cartographicPosition.latitude;
     var x=cartographicPosition.longitude;
   // alert(x);//35
  //  alert(y);//-101
    var radius=0.01;
    var segmants=360;
    var seg=Math.PI*2/segmants;
    var origin=  new Cesium.Cartesian3(x, y, 0);
    var shape = [];
    for (i = 0; i <= segmants; i++) {
        var teta=seg*i;
        var a =x+Math.cos(teta)*radius;
        var b =y+Math.sin(teta)*radius;
       // shape.push(a);
       // shape.push(b);
        var origin=  new Cesium.Cartesian3(x, y, 0);
        console.log(["origin is",origin.y,origin.x]);

        var direction=  new Cesium.Cartesian3(a, b, 0);
        console.log(["direction is",direction.y,direction.x]);



         viewer.entities.add({
            name : 'Red line on the surface',
            polyline : {
                positions : Cesium.Cartesian3.fromCartographicArray([origin.x, origin.y,
                    direction.x,  direction.y]),
                width : 5,
                material : Cesium.Color.RED
            }
        });






    }



    viewer.zoomTo(resultPolygon.position);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);