2014-02-21 1 views
2

Скажем, у меня есть схема пользователя:MongoDb Вложенный запрос массив для следующих отношений

UserSchema = new Schema({ 
name:    { 
         first: { type: String, trim: true }, 
         last: { type: String, trim: true } 
        }, 
username:   { type: String, trim: true, required: true }, 
email:    { type: String, trim: true, required: true }, 
hashed_password: { type: String, trim: true, required: true }, 
profile_image:  { type: String, trim: true, default: 'default' }, 
join_date:   { type: Date,  required:true }, 
userFollows:  [ { 
         status : { type: String, enum: [ 
          'following', 
          'followed_by' 
         ]}, 
         added : { type: Date, required:true }, 
         user : { type: Schema.ObjectId, ref: 'User'} 
        } ] 
}) 

мне нужно нажать новую userFollows в этой схеме, но мне также нужно проверить пользователя в настоящее время не следовать за пользователем (дублировать запись), но я не уверен, как выполнить этот запрос

текущий запрос я пытаюсь использовать это:

User 
.findOne(
     { username: req.user.username }, 
     { "userFollows.user": { $not: req.body.userID } } 
    ) 
.exec(function (err, currentUser) { 

}) 

но это не работает.

Я хотел бы избежать зацикливания через массив currentUser.userFollows после того, как запрос выполняется вручную проверки

Final userFollows объекта Мне нужно нажать, выглядит так:

{ 
    _id: ObjectId("53073acd9256e81e4d7b5d8e"), 
    status: "followed_by", 
    added: ISODate("2014-02-21T11:38:53.828Z"), 
    user: ObjectId("51c6ec9fedc1230700000007") 
} 
+0

Просто предположим, что-то вроде 'findOne {имя пользователя: req.user.username," userFollows.user ": {$ ne: req.body.userID}})' должен работать. Важным отличием является вызов findOne с одним объектом, а не с двумя. –

+0

Я получаю эту ошибку: {"code": "InternalError", "message": "Невозможно прочитать свойство userFollows" из null "} как с моим запросом, так и с указанным выше –

ответ

1

Есть два способа, которые вы можете сделать это обновление (в синтаксисе оболочки):

db.users.update( 
    { "username": req.user.username }, 
    { $addToSet : { userFollows : { _id: ObjectId("53073acd9256e81e4d7b5d8e"), 
            status: "followed_by", 
            added: ISODate("2014-02-21T11:38:53.828Z"), 
            user: ObjectId("51c6ec9fedc1230700000007") 
            } 
        } 
    } 
) 

, который говорит, для этого пользователя, добавить в userFollows массив этого объекта (если это не уже там).

Другой способ сделать это:

db.users.update( 
    { "username": req.user.username, "userFollows.user": { $ne: req.body.userID } }, 
    { $push : { userFollows : { _id: ObjectId("53073acd9256e81e4d7b5d8e"), 
            status: "followed_by", 
            added: ISODate("2014-02-21T11:38:53.828Z"), 
            user: ObjectId("51c6ec9fedc1230700000007") 
            } 
        } 
    } 
) 

, который говорит: для этого пользователя, который еще не имеет этот повторитель, $ толкать этот объект.

Очевидно, что вы заполняете соответствующие поля - я просто вырезаю-n-вставлю несколько значений образца из вашего вопроса, чтобы показать полный формат.

0

Checkout this о добавление данных в вложенный массив в запрос обновления.

db.collection.update( 
    { username: req.user.username }, 
    { $addToSet: { "userFollows.user": req.user.usernameThatIAdd } } 
); 
+0

Будет ли это работать, если мне нужно будет добавить статус и добавленные поля? Конечный объект userFollows выглядит следующим образом: { статус: "followed_by", добавлено: ISODate ("2014-02-21T11: 38: 53.828Z"), пользователя: ObjectId ("51c6ec9fedc1230700000007"), _id: ObjectId ("53073acd9256e81e4d7b5d8e") } –

+0

'userFollows' - ​​это больше, чем просто имя пользователя. Таким образом, '$ addToSet', как вы предложили, не будет работать. – WiredPrairie

+2

И вы обнаружите, что это не будет работать синтаксически. Вы получите сообщение об ошибке: 'can not append to array using string field name: user'. Вы не можете использовать синтаксис 'dot' с' $ addToSet'. – WiredPrairie