我正在编写自己的CLI,该CLI使用猫鼬对MongoDB数据库执行一些操作。
一切正常,除了query
对象不是{}
之外的其他事实之外,尽管有文档,但我没有任何结果。参见下面的示例。
const program = require('commander');
const mongoose = require('mongoose');
const jsonParser = require('../helpers/json-parser');
program
.command('get <collection>')
.option('-q,--query <query>', 'MongoDB query object', jsonParser)
.option('-qo,--query-options [query-options]', 'MongoDB query options object', jsonParser)
.description('Returns documents from a MongoDB collection')
.action(action);
program.parse(process.argv);
function action(collection, options) {
let db;
mongoose.connect('<my-mongo-url>', { useNewUrlParser: true }).then(() => {
db = mongoose.connection.db;
console.log(options.query);
return db.collection(collection).find(options.query, options.queryOptions).toArray().then((docs) => {
console.log(docs);
mongoose.disconnect();
});
})
.catch((err) => {
if (db) {
mongoose.disconnect();
}
});
}
运行$ my-cli get users -q '{}'
得到以下结果:
[{_id:5cfe593b3bb7cb82644651f0, 电子邮件:“ foobar@gmail.com”, createdAt:2019-06-10T13:20:59.784Z, 更新时间:2019-06-10T13:20:59.784Z, 角色:“用户”, __v:0}]
运行$ my-cli get users -q '{"_id": "5cfe593b3bb7cb82644651f0"}'
得到以下结果:
[]
运行$ my-cli get users -q '{"limit": 1}'
得到以下结果:
[]
运行$ my-cli get users -q '{"skip": 0}'
得到以下结果:
[]
我什至尝试直接在代码中执行db.collection(collection).find({_id: "5cfe593b3bb7cb82644651f0"})
,但它仍然只给我一个空数组。
我希望所有这些查询都输出相同的内容,但不会。为什么会这样?
答案 0 :(得分:1)
您使用的是Mongoose,但没有使用架构,而是直接查询到MongoDB(因此,我不了解使用它的目的。)。这样,您应该将_id字段与ObjectId进行比较:
db.collection(collection).find({_id: ObjectId("5cfe593b3bb7cb82644651f0")})
或
$ my-cli get users -q '{"_id": ObjectId("5cfe593b3bb7cb82644651f0")}'
如果我没记错,则其他查询未运行,因为您正在传递选项作为查询过滤器,因此应使用-qo
标志:
$ `my-cli get users -qo '{"limit": 1}'
答案 1 :(得分:1)
mongoDB中的_id
不是字符串,实际上是ObjectId的实例。所以也许你应该去db.collection(collection).find({_id: ObjectId("5cfe593b3bb7cb82644651f0")})
。
对于'{"limit": 1}'
和'{"skip": 0}'
,我了解到您想Modify the Cursor Behavior来限制或跳过搜索结果。
但是,db.collection.find接收两个参数:query
和projection
,因此可以将'{"limit": 1}'
或'{"skip": 0}'
作为find
的辅助参数不是你想要的。