【问题标题】:how can i add conditional fields on output-query of mongodb?如何在 mongodb 的输出查询中添加条件字段?
【发布时间】:2012-12-26 17:51:47
【问题描述】:

我的架构如下所示:

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 }

然后我想显示,通过查询它来跟踪某种输出

(with user_id = id1){ name : A, like : 1}, { name : B, like : 1}, { name : C, like : 0}

(with user_id = id2){ name : A, like : 1}, { name : B, like : 0}, { name : C, like : 0}

也就是说,我想在这里添加一个名为“like”的新字段。

如果user_id存在于array(likes)中,like为1,否则为0。

我能做到吗?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

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

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

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

    【讨论】:

    • likedProducts 在您的示例中只是一个子文档,它不是一个真正的集合。
    • 它不应该是单独的集合,它只是用户集合中的内部数组。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-02-14
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多