繁体   English   中英

如何使用mongodb中的node.js搜索数组中的元素?

[英]How to search an element in array using node.js in mongodb?

在mongodb中有一个如下文档,

{
   "_id": ObjectId("57443657ee5b5ccc30c4e6f8"),
   "name": "Kevin",
   "email": "kevinwarn@gmail.com",
   "password": "$2a$13$iZ0PhuY6VlBF6qC9rUredrG39Fw5pEKkIh.VCLiGsLPZMKYveyzey",
   "mobile": "9980896745",
   "__v": NumberInt(0),
   "ocassionTypes": [
     {
       "occasiontype": "Anniversary",
       "date": "2016-05-30T18:30:00.000Z" 
    },
     {
       "occasiontype": "Donation",
       "date": "2016-07-24T18:30:00.000Z" 
    },
     {
       "occasiontype": "House Warming",
       "date": "2016-09-21T18:30:00.000Z" 
    } 
  ] 
}

所以我在写的NodeJS查询搜索occasiontype在元素ocassionTypes阵列像下面,

router.post('/find-registry', function(req, res){
    var uEmail = req.body.email;
    var uocType = req.body.userOccasion;
    var findUserId = function(db, callback) {

            var cursor =db.collection('users').find({email:uEmail, ocassionTypes: {$elemMatch: {occasiontype:uocType}}}).toArray(function(err, docs1){
                if(err){  
                    callback(new Error("Some problem"));
                } else {
                    callback(null,docs1);
                } 
            });
    };

    MongoClient.connect(config.database, function(err, db) {
        assert.equal(null, err);
        findUserId(db, function(err,docs1) {
            db.close();
            if(err) return res.json({result:null})
            else
            return res.json({result1:docs1});
        });
    });                     
});

使用此查询我得到第0个索引元素,但是如果我给第1个和第2个元素,它总是在输出中只显示第0个索引。

在前端我给出了输入,如下图所示。

file.html

前端图像

我的查询有什么问题吗? 请帮我解决这个问题。

如果您在子文档中搜索,mongodb将返回所有子文档而不是匹配的子文档。 你可以限制没有。 使用以下代码的子文档。

var cursor =db.collection('users').find({email:uEmail, ocassionTypes: {$elemMatch: {occasiontype:uocType}}},{email: 1, ocassionTypes: {$elemMatch: {occasiontype: uocType}}}).toArray(function(err, docs1){
                if(err){  
                    callback(new Error("Some problem"));
                } else {
                    callback(null,docs1);
                } 
            }); 

它没有经过测试但应该可行。

您的查询是正确的,但它将为匹配的文档提供完整的数组

只需在查询中添加投影即可

db.collection('users').find({email:uEmail, ocassionTypes: {$elemMatch: {occasiontype:uocType}}},{email:1, ocassionTypes: {$elemMatch: {occasiontype:uocType}}})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM