1

我的架构如下所示:

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存在于array(likes)中,like为1,否则为0。

我可以做到这一点吗?

4

2 回答 2

1

最好的方法是在用户模式中收集喜欢的产品 ID。因此,当有人喜欢产品时,您必须将 userId 添加到产品集合中,并将产品 ID 添加到用户集合中。这是在 mongodb 中实现多对多关系的常用方法。可选,为了提高读取性能,您可以将产品名称非规范化为用户:

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

但请记住,非规范化会增加写入操作的开销。在产品名称更新时,您也将在用户集合中更新它。

于 2012-12-26T08:03:27.317 回答
0

对于您的架构,您应该执行以下查询:

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

这样,您将获得带有idXuserId 条目的产品。likes所有其他的在数组中都没有 userId 。使用此方法,您需要将输出与1相加,而其他不在输出中的输出与0相加。

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

于 2012-12-26T09:51:47.720 回答