如何从JSON文档数组中提取字段数组?

时间:2013-07-16 14:53:38

标签: javascript node.js mongodb

我有2个mongodb集合,stu_credsstu_profile。我首先想要从stu_creds检索所有学生记录,其中stu_pref_contact是电子邮件,然后是那些stu_id我要从stu_profile检索完整的个人资料。问题是,第一个查询返回一个JSON文档数组,每个文档都包含一个字段stu_id。这是我的查询和结果:

db.stu_creds.find({"stu_pref_contact" : "email"}, {'_id' : 1})

结果:

[{ "_id" : ObjectId("51927cc93080baac04000001") },
{ "_id" : ObjectId("51927d7b3080baac04000002") },
{ "_id" : ObjectId("519bb011c5c5035b2a000002") },
{ "_id" : ObjectId("519ce3d09f047a192b000010") },
{ "_id" : ObjectId("519e6dc0f919cfdc66000003") },
{ "_id" : ObjectId("51b39be0c74f0e3d23000012") },
{ "_id" : ObjectId("51b39ca9c74f0e3d23000014") },
{ "_id" : ObjectId("51b39cb7c74f0e3d23000016") },
{ "_id" : ObjectId("51b39e87c74f0e3d23000018") },
{ "_id" : ObjectId("51b39f2fc74f0e3d2300001a") },
{ "_id" : ObjectId("51b39f47c74f0e3d2300001c") },
{ "_id" : ObjectId("518d454deb1e3a525e000009") },
{ "_id" : ObjectId("51bc8381dd10286e5b000002") },
{ "_id" : ObjectId("51bc83f7dd10286e5b000004") },
{ "_id" : ObjectId("51bc85cbdd10286e5b000006") },
{ "_id" : ObjectId("51bc8630dd10286e5b000008") },
{ "_id" : ObjectId("51bc8991dd10286e5b00000a") },
{ "_id" : ObjectId("51bc8a43dd10286e5b00000c") },
{ "_id" : ObjectId("51bc8a7ddd10286e5b00000e") },
{ "_id" : ObjectId("51bc8acadd10286e5b000010") }]

问题是,我不认为我可以使用上面的数组作为我的第二个查询的$in子句的一部分来检索学生档案。我必须遍历数组并创建一个新数组,它只是一个对象ID数组,而不是一个JSON文档数组。

有更简单的方法吗?

3 个答案:

答案 0 :(得分:2)

使用Array.map(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)。这允许您对数组的每个元素执行转换,返回一个转换项的新数组。

var arrayOfIds = result.map(function(item){ return item._id; });

在ECMAScript 5中引入了Array.map。如果您正在使用node.js,现代浏览器或Array polyfill,它应该可以使用。

答案 1 :(得分:0)

嗯,我错过了什么,或者你想要以下内容:

var results = [];
for(var i = 0; i < yourArray.length; i++) {
    results.push(yourArray[i]._id);
}

答案 2 :(得分:0)

您可以使用$or

db.stu_profile.find({ $or : results }) // `results` is your list of ObjectId's

但它比$in慢得多,所以我建议使用其他答案之一;)