我的架构如下所示:
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}
所以说,我想在这里添加一个名为'like'的新字段。
如果user_id存在于数组(喜欢)中,则为1,如果不存在,则应为零。
我可以做到这一点吗?
答案 0 :(得分:1)
最好的方法是在用户架构中收集喜欢的产品ID。因此,当有人喜欢产品时,您必须将userId添加到产品集合中,并将产品ID添加到用户集合中。这是在mongodb中实现多对多关系的常用方法。可选,为了提高读取性能,您可以将产品名称非规范化为用户:
var userSchema = new Schema({
name : String,
likedProducts : [{
_id : Schema.Types.ObjectId,
productName: String
}]
});
但请记住,非规范化会增加写操作的开销。在产品名称更新时,您也将在用户集合中更新它。
答案 1 :(得分:0)
对于您的架构,您应该执行以下查询:
db.collection.find({ likes: { $elemMatch: { user_id: idX }}});
这样,您将获得包含idX
userId条目的产品。所有其他的在likes
数组中没有userId。使用此方法,您需要使用 1 添加输出 0 ,而输出中的其他输出 0 。
您没有提到userId是否在同一个数组中有不同的条目,因为这会改变问题。