gpt4 book ai didi

node.js - 如果数组是变量,nodejs mongodb $in [array] 不工作

转载 作者:可可西里 更新时间:2023-11-01 09:13:40 25 4
gpt4 key购买 nike

这对我来说很奇怪。如果将数组 onlyIds 放入我的数据库的聚合查询中,我将得不到任何结果。但是,如果我把从第 5 行打印出来的 onlyIds 的内容放在一起,如下所示:

["52e953942a13df5be22cf792","52e953942a13df5be22cf793","52e953942a13df5be22cf797"...]

然后就可以了。但如果我使用变量则不会。

这个函数:

var onlyIds = [];
for (var i = 0; i < users.length; i++) {
onlyIds.push(users[i]._id);
}
console.log("ids: " + JSON.stringify(onlyIds)); <---------- not empty

db.collection('posts', function(err, collection) {
collection.aggregate([
{$match: {user_id: {$in: onlyIds}}}, <------- not working
{$match: {created:{$gte: 0}}},
{$sort:{"created": -1}},
{$skip: req.body.skip},
{$limit: req.body.limit}
],

function(err, posts) {
var errorNo, content, message;
if (err) {
errorNo = resSend.errorDB;
message = JSON.stringify(err);
} else {
errorNo = resSend.errorNo;
content = posts;
message = "";
--> console.log(JSON.stringify(posts));
}
resSend.sendResponse(res, resSend.errorNo, content, message);
});
});

简而言之,为什么这样做有效:

{$match: {user_id: {$in: ["52e953942a13df5be22cf792","52e953942a13df5be22cf793","52e953942a13df5be22cf797"...]}}}

这不是:

{$match: {user_id: {$in: onlyIds}}}

而行不通的那一行,在另一个函数中运行得很好。有什么想法或启示吗?

编辑:切换为查找并使用以下答案,如下所示:

collection.find({'user_id': {$in: onlyIdsX}}).toArray(function(err, posts)

也不行。

回答:

正如下面所选答案所示,当您搜索的变量是 ObjectId 或字符串时。对于其他任何人,请确保数据库中的变量与您尝试匹配的变量类型相同。在我的例子中,两者都应该是字符串,但“onlyIds”中的一个是 ObjectId。

最佳答案

尝试使用以下代码修改循环:

var ids = ["52e953942a13df5be22cf792","52e953942a13df5be22cf793","52e953942a13df5be22cf797"];
var obj_ids = [];
for (var i = 0; i < users.length; i++) {
obj_ids.push(new ObjectID(users[i]._id.toString()));
var obj_ids.push(users[i]._id); // <== This will not work if your DB has _id : ObjectID("xyz") [i.e. you are not overiding defaults]
}

并且您应该在代码中包含 var ObjectID = require('mongodb').ObjectID;
您应该使用 .toArray(function(err,.. (在您的情况下不适用,因为您使用了聚合框架)。如果您不使用 findOne()(有关这方面的更多信息,请访问 link)


以下是发现问题(在评论中)和工作代码的示例:

var mongo = require('mongodb'),
Server = mongo.Server,
Db = mongo.Db,
ObjectID = require('mongodb').ObjectID;
var BSON = require('mongodb').BSONPure;
var server = new Server('localhost', 27017, {
auto_reconnect: true
});
var MongoClient = require('mongodb').MongoClient

//let id = your _id, smth like '6dg27sh2sdhsdhs72hsdfs2sfs'...
var users = ["52e953942a13df5be22cf792","52cbd028e9f43a090ca0c1af","52e953942a13df5be22cf797"];
var obj_ids = [];
for (var i = 0; i < users.length; i++) {
obj_ids.push(new ObjectID(users[i].toString()));
//obj_ids.push(users[i]._id); // <== This will not work if your DB has _id : ObjectID("xyz") [i.e. you are not overiding defaults]
}

MongoClient.connect('mongodb://127.0.0.1:27017/YourDBName', function(err, db) {
console.log('err' + err);
db.collection('posts', function(error, collection) {
//collection.find({_id:{$in: users}}),function(err, docs) { //This will not work
collection.find({_id:{$in: obj_ids}}).toArray(function(err, docs) {
console.log("Printing docs from Array. count " + docs.length);
docs.forEach(function(doc) {
console.log("Doc from Array ");
console.dir(doc);
});
});
});
});

关于node.js - 如果数组是变量,nodejs mongodb $in [array] 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22907451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com