代码之家  ›  专栏  ›  技术社区  ›  Chrillewoodz

db.collection(collection).find(<query>)在查询对象包含属性时立即返回空数组

  •  0
  • Chrillewoodz  · 技术社区  · 6 年前

    我正在编写自己的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 '{}' 给出以下结果:

    [U ID:5CFE593B3BB7CB82644651F0, 邮箱:'foobar@gmail.com', 创建日期:2019-06-10t13:20:59.784z, 更新日期:2019-06-10t13:20:59.784z, 角色:'用户', _五: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 回复  |  直到 6 年前
        1
  •  1
  •   L_K    6 年前

    这个 _id 在MongoDB中不是字符串,实际上它是 ObjectId . 所以也许你该走了 db.collection(collection).find({_id: ObjectId("5cfe593b3bb7cb82644651f0")}) .

    至于 '{"limit": 1}' '{"skip": 0}' ,我知道你想 Modify the Cursor Behavior 限制或跳过搜索结果。

    但是, db.collection.find 接收两个参数: query projection ,所以传球 “”极限:1” '“跳过”:0' 作为 find 次要参数可能不是你想要的。

        2
  •  1
  •   virgiliogm    6 年前

    您使用的是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}'