How to do raw mongodb operations in mongoose?

2019-01-13 05:51发布

问题:

I'm asking this because when I write unit tests, I want to drop the test database and insert some initialize data, and also check the data in mongodb in testing. So I need raw operations to mongodb.

How to do this in mongoose? What I can do now is just create the connection, and not find any document in mongoose's official site.

 var mongoose = require('mongoose');
 mongoose.connect('mongo://localhost/shuzu_test');

 // get the connection
 var conn = mongoose.connection;

But how to:

  1. drop the database
  2. create a collection
  3. write some data to a collection
  4. query a collection
  5. drop a collection

回答1:

See the section on "Driver Access" in the docs: http://mongoosejs.com/

Basically you can get access to the node-mongodb-native driver by doing YourModel.collection and then you can insert or remove or drop or whatever you need.

There's not a doc, but with this approach you'll get access to everything in here: https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/collection.js

Edit:

In your case you may want to skip using mongoose in your test suite and use the node-mongodb-native directly, or even write a simple mongodb shell script that can be run before your tests start.



回答2:

You can run native mongodb commands by using mongoose.connection.db. This accesses the native MongoDB driver, and you don't need to create a model.

An insert

mongoose.connection.db.collection('userCollection').insert({
  username: 'user1',
  firstName: 'Steve',
  lastName: 'LastName', 
});

An update

mongoose.connection.db.collection('userCollection').update(
  {someFilterProperty: true},
  {$set: {
     siteId: new mongoose.mongo.ObjectId('56cb91bdc5946f14678934ba'),
     hasNewSiteId: true}},
  {multi: true});
});

You can send every command specific to that database using the database connection db reference mongoose.connection.db.

This is the mongoose API doc: http://mongoosejs.com/docs/api.html#connection_Connection-db



回答3:

use this to run raw operations in mongoose.

  Model_name.collection.insertMany(array, { ordered: false },function(err, success){
            console.log(success);
        });


回答4:

Have encountered same trouble, to cleanup DBs after tests, and actual answer only confused because of absence "code blocks", so dig docs/code once more, for others-time-saving purpose posting this ;)

Mongoose collection extends Mongodb collection

/* * section collection.js * http://mongoosejs.com/docs/api.html#collection-js */

interface CollectionBase extends mongodb.Collection {

Documentation : http://mongodb.github.io/node-mongodb-native/2.1/api/Collection.html

Same goes for the connection:

The Connection class exposed by require('mongoose') is actually the driver's NativeConnection class. connection.js defines a base class that the native versions extend. See: http://mongoosejs.com/docs/api.html#drivers-node-mongodb-native-connection-js

So all "RAW" operations can be performed on collection/connection, assuming that you have

 var connection = mongoose.connection;

then:

1.drop the database:

connection.dropDatabase()

2.create a collection

connection.collection('newcollection') // creates if not exists

3.write some data to a collection

connection.collection('mybenotnewcollection').bulkWrite([
  { insertOne: { whatewer: { you: 'need' } } },
]);

4.query a collection

that's obviously not a question: findAll, find, aggregate, all allowed (see the Docs)

5.drop a collection

connection.collection('notsonewcollection').drop()