node js mongoose从集合中的数组中查找数据

时间:2015-11-19 18:58:19

标签: javascript json node.js mongodb mongoose

我正在使用node.js和mongoose我遇到了问题。我的用户集合看起来像。

{
    "_id": ObjectId("564b6deec50de8d827c0a51a"),
    "email": "ak@gmail.com",
    "ngos": [
        {
            "_id": ObjectId("564b7527ecc479e4259edff7"),
            "name": "Children trust",

        },
        {
            "_id": ObjectId("564b79e0ecc479e4259edff8"),
            "name": "Charity Two",
            "location": "Australia"

        }
    ]
}
{
    "_id": ObjectId("564e0a18c8cd4b5420a9250c"),
    "email": "some@gsomel.com",
    "ngos": [
        {
            "_id": ObjectId("564e0b3bc8cd4b5420a92510"),
            "name": "Charity Two",
            "location": "US"

        }
    ]
}

我想找到名称如ngos的所有Charity所以它应该归还给我。

  {
            "_id": ObjectId("564e0b3bc8cd4b5420a92510"),
            "name": "Charity Two",
            "location": "US"

  }
  {
            "_id": ObjectId("564e0b3bc8cd4b5420a92510"),
            "name": "Charity Two",
            "location": "Australia"

  }

我试过

User.find({"ngos.name": new RegExp(name, 'i')}, function(err, user) {
    if (err) return next(err);
    res.json(user);
});

当我返回用户时,它向我的两个用户提供了所有数据,但是如果我将res.json(user);更改为res.json(user.ngos);,我没有收到任何回复。

如何检索名称匹配的特定ngos?

由于

3 个答案:

答案 0 :(得分:1)

对最终结果数组使用正则表达式过滤,如下所示:

var rgx = new RegExp(name, 'i');
User.find({"ngos.name": rgx})
    .lean()
    .exec(function(err, users) {
        if (err) return next(err);
        var result = users.map(function (n){
            return n.ngos.filter(function(val){return rgx.test(val.name);});
        })  
        console.log(JSON.stringify(result, undefined, 4));
        res.json(result);
    });

查看下面的演示。

var cursor = [
	{   
		"ngos": [
			{
				"_id": "564b7527ecc479e4259edff7",
				"name": "Children trust",

			},
			{
				"_id": "564b79e0ecc479e4259edff8",
				"name": "Charity One",
				"location": "Australia"

			}
		]
	},
	{    
		"ngos": [
			{
				"_id": "564e0b3bc8cd4b5420a92510",
				"name": "Charity Two",
				"location": "US"

			}
		]
	}
];
var rgx = new RegExp('Charity', 'i');
var result = cursor.map(function (n){
	return n.ngos.filter(function(val){return rgx.test(val.name);});
})	

pre.innerHTML = "result: " + JSON.stringify(result, null, 4);
<pre id="pre"></pre>

答案 1 :(得分:0)

希望这有帮助,

User.find({"ngos.name": new Regex(name, 'i')},{'ngos':1}).exec(function(err,data){
    if (err) throw(err);
    res.json(data);
});

答案 2 :(得分:0)

只需在mongoose中尝试这种方式

你获得res是数组所以使用&#34; forEach&#34;

User.find({'ngos.name':new RegExp('name', 'i')}, {'ngos':1},function(err,users){
users.forEach( function(user) {
    user.ngos.forEach( function(nom) {
        console.log( nom );
    })
} );

})

在mongodb中尝试这种方式

db.user.find({'ngos.name':new RegExp('name', 'i')},{'ngos':1}).forEach( function(user) { 
user.ngos.forEach( function(nom) { 
    print( nom );
    })
} )

我认为这有助于你!