MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

sailsjs używają mongodb bez ORM

Pierwszy npm i mongodb ponieważ będziesz musiał owinąć dowolny identyfikator new ObjectID(idStr) .

Następnie możesz to zrobić:

const collection = Pet.getDatastore().manager.collection(Pet.tableName);
const res = await collection.find({ name: { $regex: /blue/ } });
const dataWithObjectIds = await res.toArray();
const dataWithIds = JSON.parse(JSON.stringify(rawDataArr).replace(/"_id"/g, '"id"'));

Stworzyłem funkcję pomocniczą, która zrobi to wszystko za nas:

/**
 * Use by chaining as if you were acting on a collection. So can use .find .aggregate etc.
 * Returns json searializable data.
 *
 * @param {class} model A model
 * @param {number} cnt - Number of chains on this, so I know when it reached the end
 */
function nativeMongoQuery(model, cnt) {

  const collection = model.getDatastore().manager.collection(model.tableName);

  let callCnt = 0;

  let req;

  const proxy = new Proxy({}, {
    get: (_, method) => (...args) => {

      if (!req) req = collection[method](...args);
      else req = req[method](...args);

      callCnt++;

      if (callCnt === cnt) {
        return (async function() {
          const rawDataArr = await req.toArray();
          return JSON.parse(JSON.stringify(rawDataArr).replace(/"_id"/g, '"id"'));
        })();
      } else {
        return proxy;
      }
    }
  });

  return proxy;

}

module.exports = nativeMongoQuery;

Nie podoba mi się parsowanie JSON, tworzenie łańcuchów i zastępowanie globalne. Ale jeśli nie zrobię stringify, to mongo _id są wszystkie ObjectId s.

Użyj go w ten sposób:

const { ObjectId } = require('mongodb');

function makeObjectId(id) {
   return new ObjectId(id);
}

const ownerIds = ['5349b4ddd2781d08c09890f4', '5349b4ddd2781d08c09890f5']
const ownerObjectIds = ownerIds.map(makeObjectId);
await nativeMongoQuery(Pet, 2).find({ owner: { $in: ownerObjectIds } }).sort({ dueAt: 1 });

Oto kolejny przykład:

const mostRecentlyCreatedPets = await nativeMongoQuery(Pet, 1).aggregate([
  { $match: { owner: { $in: ownerObjectIds } } },
  { $sort: { createdAt: -1 } },
  { $limit: 1 }
]);

cnt argument mówi ci, ile rzeczy tam przykułeś.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Porządkowanie pól z zapytania find z projekcją

  2. Błąd zapytania Mongodb Subdocuments Konwertowanie struktury kołowej do formatu JSON

  3. Jak mogę hostować własny serwer Parse w Heroku przy użyciu MongoDB?

  4. Błąd podczas włączania szyfrowania danych przy użyciu klucza lokalnego MONGODB

  5. Jak używać $hint w zapytaniu agregującym MongoDB?