2016-06-22 2 views
0

У меня есть коллекция с документами, которые могут быть общедоступными или частными. Я ищу, чтобы иметь один запрос, который может получить документ с помощью _id и проверить, является ли он конфиденциальным. Если он является частным, ему необходимо проверить, является ли пользователь, запрашивающий документ, участником объекта.Если запрос условия для mongo db

Вот объект:

{ 
    "_id" : ObjectId("5769ae620e80ea1c7f8a997f"), 
    "owner" : ObjectId("5740edae95a1b4c043d033df"), 
    "private" : false, 
    "participants" : [ 
     { 
      "uid" : ObjectId("5740edae95a1b4c043d033df"), 
      "notify" : true 
     } 
    ], 
    "messages" : [ ] 
} 

Это 2 этап запроса я написал и интересно, если я могу упростить его

function getRoom(roomId, user){ 

    db.rooms.findOne({ _id: pmongo.ObjectId(roomId) }) 
     .then(room => { 
      if(room.private){ 
      return db.rooms.findOne({ 
       _id: pmongo.ObjectId(roomId), 
       participants: {$eleMatch: {uid: String(user._id)}} 
      }) 
      } else { 
      return room 
      } 
     }) 

    } 

Любая помощь будет здорово!

ответ

3

MongoDB имеет $or оператор, который может быть использован в данном случае:

db.rooms.findOne({ $or: [ 
    { 
    _id: pmongo.ObjectId(roomId), 
    private: { $ne: true } 
    }, { 
    _id: pmongo.ObjectId(roomId), 
    participants: {$eleMatch: {uid: String(user._id)}} 
    } 
]}) 
+0

Отлично! Позволь мне дать этот выстрел! –

+0

просто получить производительность: вместо '$ ne: true' use' eq: false' – profesor79

+1

Да, он должен давать немного больше скорости, но если свойство 'private' будет пустым, оно не будет выполнено, поэтому должно быть значение по умолчанию в Модель комнаты. –

Смежные вопросы