如何在mongodb的输出查询中添加条件字段?

时间:2012-12-26 06:54:26

标签: node.js mongodb mongoose

我的架构如下所示:

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,如果不存在,则应为零。

我可以做到这一点吗?

2 个答案:

答案 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是否在同一个数组中有不同的条目,因为这会改变问题。