2012-12-26 51 views
1

我的架构如下图所示:如何在mongodb的输出查询中添加条件字段?

var productSchema = new Schema({ 
    name : String, 
    likes : [{ 
     user_id : Schema.Types.ObjectId, 
     date : Date 
    }] 
}); 

假设我有这个集合

{ name : A, likes : [ {user_id : id1, date : blahblah}, {user_id : id2, date : balh}] }

{ name : B, likes : [ {user_id : id1, date : blahblah}] }

{ name : C }

然后我想表明,以下还挺输出通过查询它

(与USER_ID = ID1){ name : A, like : 1}, { name : B, like : 1}, { name : C, like : 0}

(与USER_ID = ID2){ name : A, like : 1}, { name : B, like : 0}, { name : C, like : 0}

这么说来,我想补充新的领域,叫做 '喜欢' 在这里。

如果user_id存在于数组(like)中,就像是1,否则应该为零。

我可以做到这一点吗?

回答

1

做到这一点的最佳方法是在用户架构中收集喜欢的产品ID。因此,当某个人喜欢产品时,您必须将userId添加到产品集合和产品ID中以添加到用户集合中。这是在mongodb中实现多对多关系的常用方法。可选,以提高读取性能,可以进行非规范化的产品名称为用户:

var userSchema = new Schema({ 
    name : String, 
    likedProducts : [{ 
     _id : Schema.Types.ObjectId, 
     productName: String 
    }] 
}); 

但保持在记住,非规范化添加开销写入操作。在产品名称更新上,您也将在用户集合中更新它。

+0

'在你的例子中只有产品'是一个子文档,它不是一个真正的集合。 –

+0

它不应该是单独的集合,它只是用户集合中的内部数组。 –

0

为了您的架构,应执行以下查询:

db.collection.find({ likes: { $elemMatch: { user_id: idX }}}); 

这样一来,你会得到的条目的产品,为idX用户ID。所有其他人在likes阵列中没有userId。使用此方法,您需要将输出与相加,而其他输出不与输出中的输出相加,即。

您没有提及userId是否可能在同一个数组中有不同的条目,因为这会改变问题。

相关问题