我想搜索一些在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)
}
})
})
该代码没有错误,也没有警告。
答案 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);
}
})
});