如何在mongodb中查找具有特定字段的集合?

时间:2019-01-10 03:11:19

标签: node.js mongodb mongoose

我想搜索一些在MongoDB中具有特定字段的集合。假设有两个集合有一个 name 字段,另一个没有。

尽管我发现有人问this,但仍使用mongoose.js,现在答案已经过时了。现在的猫鼬版本该怎么做?

这是我尝试的代码,我成功获取了所有集合的名称,但是当我搜索特定字段时,它不起作用,也没有给我任何错误。

    mongoose.connection.db.listCollections().toArray((error, collections) => {
        collections.forEach( (collection) => {
           var collectionName = mongoose.connection.db.collection(collection.name)
                var count = collectionName.find({ "duck_name": { $exists: true }}).count()
                    if ( count > 0 ){
                        console.log(collection.name)
                        }
                    })
                })

该代码没有错误,也没有警告。

1 个答案:

答案 0 :(得分:0)

mongoose.connection返回本地mongodb连接,您使用db.前缀执行的所有操作都与您直接在mongodb控制台上执行的操作相同。

因此,当您使用本机连接描述符时,请不要等待猫鼬的行为相同。

当您本地处理集合时,您必须了解find方法会返回游标。

const db = mongoose.connection.db;
const collections = db.listCollections()

collections
  .toArray((error, collections) => {
    collections.foreach(async collection => {
      const query = {"duck_name": { $exists: true }};
      const count = await collection.find(query).count();
      if (count === 0) return;

      console.log('Found:', count, 'documents in collection:', collection.name);
      const cursor = await collection.find(query);
      while(await cursor.hasNext()) {
        const document = await cursor.next();
        console.log('document:', document._id);
      }
    })
  });   

或在光标上使用toArray方法:

const db = mongoose.connection.db;
const collections = db.listCollections()

collections
  .toArray((error, collections) => {
    collections.foreach(async collection => {
      const query = {"duck_name": { $exists: true }};
      const count = await collection.find(query).count();
      if (count === 0) return;

      console.log('Found:', count, 'documents in collection:', collection.name);
      const documents = await collection.find(query).toArray();
      for(const document of documents) {
        console.log('document:', document._id);
      }
    })
  });