2016-12-14 86 views
0

我有一个模型,看起来像这样:猫鼬重复申报

var conversationsSchema = new mongoose.Schema({ 
    start_date: Date, 
    users: [{ 
     user_id: mongoose.Schema.ObjectId, 
     socket_id: String 
    }] 
}); 

我想找到两个用户,所以我使用下面的代码之间的对话。

Conversation.findOne({ 
      'users.user_id': {$in: thisUsers.user_id}, 
      'users.user_id': {$in: thisPartner.user_id} 
}); 

此作品发现。但是,它看起来不正确,并且像这样做有更好的方法。我的编辑还说'重复申报'。

有没有更好的方法来做到这一点?

+0

你可以尝试Conversation.findOne({ 'users.user_id': {$ in:thisUsers.user_id,thisPartner.user_id}}); ? – Veeram

+0

该语法扔和错误,所以我试图把项目放在一个数组,如:'users.user_id':{$ in:[thisUsers.user_id,thisPartner.user_id]}。然后,我在对话中更改了其中一个用户的ID,但仍然找到一个,即使其中一个错误,但另一个是正确的。 – Tom

+0

您是否需要查找包含用户标识和合作伙伴标识的行?如果是,那么你需要所有的操作员。你可以试试Conversation.findOne({'users.user_id':{$ all:[thisUsers.user_id,thisPartner.user_id]}}); ? – Veeram

回答

0

重复的de 'duplicate declaration'是由于在查询对象中使用了两次相同的密钥('users.user_id')(以前的值被丢弃)。

您可以使用$in Operator to Match Values

Conversation.findOne({ 
    $and: [ 
    {'users.user_id': {$in: [ thisUsers.user_id ]}}, 
    {'users.user_id': {$in: [ thisPartner.user_id ]}} 
    ] 
}); 

或者干脆:

Conversation.findOne({ 
    $and: [ 
    {'users.user_id': thisUsers.user_id}, 
    {'users.user_id': thisPartner.user_id} 
    ] 
}); 

或更好$all

Conversation.findOne({ 
    'users.user_id': {$all: [ thisUsers.user_id, thisPartner.user_id ]} 
});