我有2个mongodb集合,stu_creds
和stu_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文档数组。
有更简单的方法吗?
答案 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
慢得多,所以我建议使用其他答案之一;)