【问题标题】:db.collection(collection).find(<query>) returns empty array as soon as query object contains properties只要查询对象包含属性,db.collection(collection).find(<query>) 就会返回空数组
【发布时间】:2019-10-26 16:50:12
【问题描述】:

我正在编写自己的 CLI,它使用 mongoose 对 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', 创建于: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"}),但它仍然只给我一个空数组。

我希望所有这些查询都输出相同的内容,但事实并非如此。这是为什么呢?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案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 辅助参数可能不是您想要的。

    【讨论】:

      【解决方案2】:

      您使用的是 Mongoose,但没有使用 Schemas 并直接查询 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}'
      

      【讨论】:

        猜你喜欢
        • 2015-04-04
        • 1970-01-01
        • 2018-05-18
        • 1970-01-01
        • 2014-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-24
        相关资源
        最近更新 更多