使用node.js / express和mongoDB构建API。我有两个集合,像多对多关系,用户和项目。我想获得用户关注的所有项目。用户Items是一个数组,其中ID指的是Items。
我如何查询,以便获取useritems数组中的所有项目?
类别:
用户:
{
email: "johnny@hotmail.com",
username: "johnny",
useritems: ["51e101df2914931e7f000003", "51cd42ba9007d30000000001"]
}
产品:
{
"name": "myitem",
"description": "Description of item"
"_id": "51e101df2914931e7f000003"
}
{
"name": "myitem2",
"description": "Description of item2"
"_id": "51cd42ba9007d30000000001"
}
{
"name": "myitem3",
"description": "Description of item3"
"_id": "51e101df2914931e7f000005"
}
编辑:
我更新了代码。我现在根据用户ID获取用户项id的数组。问题是我尝试将项目发送到数组。物品总是空的。我的查询有问题吗?
exports.findItemsByUserId = function(req, res) {
//var id = req.params.id;
var userId = "51e6a1116074a10c9c000007"; //Just for testing
db.collection('users', function(err, collection) {
collection.findOne({'_id':new BSON.ObjectID(userId)}, function(err, user) {
db.collection('items', function(err, collection) {
console.log("user undefined? ",user);
console.log("useritems ",user.useritems);
collection.find({'_id': {'$in' : user.useritems}}).toArray(function(err, items) {
console.log("useritems ",user.useritems); // <--Gets me array with the ids
console.log("items ", items); //<--Empty
res.send(items);//Empty
});
});
});
});
};
答案 0 :(得分:0)
也许这更像是它?
exports.findItemsByUserId = function(req, res) {
var userId = "51e101df2914931e7f000003"; //Just for testing
var user = db.users.find({"_id": userId});
var items = db.items.find({'_id': {'$in' : user.useritems}});
res.send(items.toArray());
};
答案 1 :(得分:0)
问题解决了。不是最花哨的解决方案,但它的工作原理。只是循环一些数组。猜猜有一些适当的查询。
exports.findItemsByUserId = function(req, res) {
var id = req.params.id; //<--- was disabled, it will give an error when testing this code.
var userId = "51e6a1116074a10c9c000007"; //Just for testing
db.collection('users', function(err, collection) {
collection.findOne({'_id':new BSON.ObjectID(id)}, function(err, user) {
db.collection('items', function(err, collection) {
var itemsArray = []
var itemIds = user.useritems
for (var i = 0; i < itemIds.length; i++) {
itemIds[i]
collection.findOne({'_id':new BSON.ObjectID(itemIds[i])}, function(err, item) {
itemsArray.push(item);
if(itemIds.length === itemsArray.length){
res.send(itemsArray);
}
});
};
});
});
});
};