Как написать функции mon goose по запросу mongodb? - PullRequest
1 голос
/ 26 февраля 2020

Это запрос для выбора документа комнаты, который содержит user1 и user2.

db.getCollection("rooms").find({
$and:[            
    {users: ObjectId("5e2916615f55cc6e3cb9838b")},    
    {users: ObjectId("5e2b51107d1c624260620e9e")}    
   ]
})

Он хорошо работает в оболочке mongodb и возвращает следующие документы.

{ 
    "_id" : ObjectId("5e55ae0e07f8bf48dc602d1c"), 
    "users" : [
        ObjectId("5e2916615f55cc6e3cb9838b"), 
        ObjectId("5e2b51107d1c624260620e9e")
    ], 
    "label" : "", 
    "__v" : NumberInt(0)
}
{ 
    "_id" : ObjectId("5e55ae98bec6265a48d453e6"), 
    "users" : [
        ObjectId("5e2916615f55cc6e3cb9838b"), 
        ObjectId("5e2b51107d1c624260620e9e")
    ], 
    "label" : "", 
    "__v" : NumberInt(0)
}

Я хочу используйте этот запрос в nodejs с mon goose.

import { Schema, model } from "mongoose";
import mongodb from "mongodb";

const RoomSchema = new Schema({
  users: [
    {
      type: Schema.Types.ObjectId,
      ref: "User",
      required: true,
      autopopulate: { select: "name phone photo" }
    }
  ],
  label: { type: String, text: true }
});

export default model("Room", RoomSchema);
... ... ...
const filter = {
        $and: [
          { users: new mongodb.ObjectID(uid1) },
          { users: new mongodb.ObjectID(uid2) }
        ]
      };
const items = Room.find(filter);

Но он не работает. В чем ошибка?

TypeError: Converting circular structure to JSON
    --> starting at object with constructor 'NativeTopology'
    |     property 's' -> object with constructor 'Object'
    |     property 'sessionPool' -> object with constructor 'ServerSessionPool'
    --- property 'topology' closes the circle
    at JSON.stringify (<anonymous>)
    at stringify (F:\work\find-stuff\backend\node_modules\express\lib\response.js:1123:12)
    at ServerResponse.json (F:\work\find-stuff\backend\node_modules\express\lib\response.js:260:14)
    at F:\work\find-stuff\backend\src\controllers\room.controller.ts:75:27
    at Generator.next (<anonymous>)
    at F:\work\find-stuff\backend\src\controllers\room.controller.ts:8:71
    at new Promise (<anonymous>)
    at __awaiter (F:\work\find-stuff\backend\src\controllers\room.controller.ts:4:12)
    at createItem (F:\work\find-stuff\backend\src\controllers\room.controller.ts:59:16)
    at Layer.handle [as handle_request] 

Меня это очень смущало.

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Model.find - это асинхронная операция, которую нужно ожидать / продолжать, используя .then() или передавая обратный вызов:

const items = await Room.find(filter);
0 голосов
/ 26 февраля 2020

Попробуйте этот код, он должен работать

const filter = [
  { users: new mongodb.ObjectID(uid1) },
  { users: new mongodb.ObjectID(uid2) }
]

const items = Room.find({ $and: filter });
...