查询对象包含属性后,db.collection(collection).find(<query>)返回空数组

时间:2019-06-12 08:24:06

标签: node.js mongodb mongoose

我正在编写自己的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"}),但它仍然只给我一个空数组。

我希望所有这些查询都输出相同的内容,但不会。为什么会这样?

2 个答案:

答案 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接收两个参数:queryprojection,因此可以将'{"limit": 1}''{"skip": 0}'作为find的辅助参数不是你想要的。