node.js使用monk从数组中按id获取文档

node.js getting documents by id from an array using monk

本文关键字:id 获取 文档 数组 js 使用 monk node      更新时间:2023-09-26

我正试图用一组id 从mongodb中的一个集合中获取一些文档

类似于SQLish

SELECT * FROM TABLE WHERE <id> IN [1,3,4]

这是我正在使用的代码:

var prodCollection = req.db.get('products');
      prodCollection.find({'-_id':{'$in':["572446507cd5bb7304d75993","572446507cd5bb7304d75994"]}},{}, function(err, docs){
        if(err) throw err;
        res.send(docs);
      });

我的设置是使用express和monk在本地主机上运行node.js服务器。我也尝试过同一代码的不同版本,IN和_id参数有或没有单引号,但运气不好,我返回的docs数组总是空的。我可以通过从控制台访问数据库来确认我的数据库确实包含集合和文档:

> db.products.find()
{ "_id" : ObjectId("572446507cd5bb7304d75993"), "name" : "apples", "quantity" : 20, "checked" : false }
{ "_id" : ObjectId("5724466c7cd5bb7304d75994"), "name" : "bananas", "quantity" : 2, "checked" : false }
{ "_id" : ObjectId("5724467e7cd5bb7304d75995"), "name" : "cerial", "quantity" : 10, "checked" : true }

您正试图使用字符串查询数据库,其中ObjectID是一个实际对象。要将字符串转换为ObjectID,可以使用mongoose.Types.ObjectId(string),我不确定这是否能解决您的问题,但这是朝着正确方向迈出的一步。

看起来MaxKroshka和Tal Avissar都是正确的,我设法使查询正常工作(尽管目前它仍然只返回第一个项目,并按照建议修改了我的代码:

首先,monk确实不需要用-符号转义id字段名,所以我用一个普通的id字符串替换了它。

其次,似乎可以从一个普通的十六进制id字符串转换为一个成熟的id对象,该对象可以使用monks的collection.id(hexString)函数传递给查询。

这是我修改后的代码,它起作用了(再次,但只返回提供的数组中的第一个)

var prodCollection = req.db.get('products');
var idObjects = [];
//this was the real magic to get it working, converting string id to object
for(var i=0; i<group.products.length; i++){
    dObjects.push(prodCollection.id(group.products[i]));
}
prodCollection.find({'_id':{$in:idObjects}},{}, function(err, docs){
if(err) throw err;
    res.send(docs);
});