- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有以下型号:
产品:
var ProductSchema = new Schema({
name: String,
comments: [{ type: Schema.Types.ObjectId, ref: 'Comment'}],
_user: { type: Schema.Types.ObjectId, ref: 'User'}
});
评论:
var CommentSchema = new Schema({
text: String,
rating: Number,
_product: { type: Schema.Types.ObjectId, ref: 'Product'}
});
我目前所做的是检索所有产品及其用户:
router.get('/', function(req, res, next) {
Product.find().populate('_user').exec(function (err, products) {
if (err) return next(err);
res.json(products);
});
});
我想在结果中添加一个“平均”字段,其中包含每个产品的所有评论的平均值,因此结果将如下所示:
[{name: "Product 1", _user: {name: "Bob"}, average: 7.65},...]
这可以通过唯一查询实现吗?每次添加新评论时,我是否需要计算平均值并将其存储在产品文档中?
谢谢!
最佳答案
也许您应该尝试计算“运行平均值”。您只需要知道有多少评级,以及它们的平均值是多少。为 MongoDB 中的每个文档保存相同的平均值应该是一种不好的做法,希望这对您有所帮助。所以你可以像这样创建模式:
var AverageProductRatingSchema = new Schema({
productId: {type: Schema.Types.ObjectId, ref: 'Product'},
averageRating: {type: Number},
numberOfRatings: {type: Number}
});
然后像这样实现 addRating() 函数:
function addRating(newRating, productId) {
/* Find document that holds average rating of wanted product */
AverageProductRating.findOneAsync({productId: productId})
.then(function (avgProdRating) {
/*
Calculate new average using the Running Average method.
http://www.bennadel.com/blog/1627-create-a-running-average-without-storing-individual-values.htm
*/
var newAverageRating = (avgProdRating.averageRating * avgProdRating.numberOfRatings + newRating) / (avgProdRating.numberOfRatings + 1);
var newNumberOfRatings = avgProdRating.numberOfRatings + 1;
AverageProductRating.update(
{ productId: productId },
{
$set: {
averageRating: newAverageRating,
numberOfRatings: newNumberOfRatings
}
});
});
}
这是描述类似问题的链接: http://www.bennadel.com/blog/1627-create-a-running-average-without-storing-individual-values.htm
关于node.js - Mongoose / express : average of subdocuments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29322497/
我的数据库架构如下所示: { "_id" : 137, "name" : "Tamika Schildgen", "scores" : [ { "score" : 4.4339
我正在寻找有关关闭属性选择的正确语法的帮助,该属性是一组子文档。我希望有一些类似的东西: var UserSchema = new Schema( { fb_id
我正在执行一个循环和更新,类似于this . 我有一个包含如下字段的现有文档: "field1" : { "field2" : [] } 使用空数组。 使用 Java,如何将文档放入空数组中?
我有以下型号: 产品: var ProductSchema = new Schema({ name: String, comments: [{ type: Schema.Types.ObjectId,
我一直在尝试通过 _id 在找到的文档中获取子文档。 示例架构 var User = mongoose.Schema({ name: String, pho
我有以下 mongo 集合: { "_id" : ObjectId("000000000001"), "username" : "user1", "password" : "p
我是 Express/Mongoose 和后端开发的新手。我正在尝试在我的架构中使用 Mongoose 子文档并将数据从表单发布到 MLab 数据库。 当我只使用父架构时,我成功地发布到数据库,但是当
具有以下更新查询: var template = {name:'my_name', ...}; ApplicationModel.update({ _id: idApplication
我有一个名为 Routine 的类,它具有属性名称和练习。 RoutineExercises 类型的 ArrayList 中的练习。 当我将我的例程写入我的 Firestore 数据库时,它会像它应该
在 mongoose 上,有一个很好的选项可以默认使用 select: false 选项从查询中删除一些字段。 例如: var FileSchema = new Schema({ filename
我在 dotnetcore 2.1 中使用 MongoDB.Driver nuget 包。我正在尝试返回集合中的文档列表,其中子文档字段等于我拥有的列表中包含的任何项目。理想情况下,我需要在 C# 语
我在 mongoose 中有一个 upsert 查询,它在 3.8 中运行,但是在我升级到 4 之后,我得到了 Unable to invalidate a subdocument that has
我已经开始学习Mongo了。给定以下集合,例如所谓的帖子,我将如何将新评论插入到现有文档中?我在 mongo 网站上看到的示例是针对“简单”集合的。感谢您的帮助。 { "_id" : ObjectId
例如我们有收藏 {field: {subfield: 'name'}} {field: {subfield: 'phone'}} 我可以找到没有点符号的文档吗?像这样 db.test.find({fi
我正在尝试在聚合上使用 $filter 。我需要过滤一个名为“extras”的数组,该数组至少与他的一个“季节”与给定的“日期”相交。 这里是一个例子: var from = new Date(201
我有一个使用expressjs和mongoosejs编写的Web api。 应用程序中的主架构包含一个子文档permissions,其中包含数组字段。这些数组包含可以对该文档执行操作的用户 ID。 我
通过指定 fields 参数,可以轻松管理 db.find() 结果集中某些字段的存在(我使用 Meteor 并在服务器端测试所有查询, 在发布功能中)。说 Meteor.collection.fin
我是一名优秀的程序员,十分优秀!