小编Bla*_*ven的帖子

在mongodb中获取具有相同属性的文档

我有一个包含这样的文档的集合:

[
  {
    "user_id": 1,
    "prefs": [
      "item1",
      "item2",
      "item3",
      "item4"
    ]
  },
  {
    "user_id": 2,
    "prefs": [
      "item2",
      "item5",
      "item3"
    ]
  },
  {
    "user_id": 3,
    "prefs": [
      "item4",
      "item3",
      "item7"
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

我想要的是编写一个聚合,它将得到一个user_id列表,其中包含映射到列表中相同数量的所有用户prefs。例如,如果我运行聚合user_id = 1,我必须得到:

[
  {
    "user_id": 2,
    "same": 1
  },
  {
    "user_id": 3,
    "same": 2
  }
]
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

4
推荐指数
1
解决办法
258
查看次数

在Aggregation管道,MapReduce或runCommand中使用存储的JavaScript函数

有没有办法使用db.system.js.save(...)在管道或mapreduce中保存的用户定义函数?

mongodb mongodb-query aggregation-framework

4
推荐指数
1
解决办法
4037
查看次数

通过与不同权重的相关性查询

我提供了产品的搜索功能,

用户可以通过多个标签进行搜索

例如,用户可以搜索"iphone,128G,usa"

如果搜索字词在标题中匹配,则会得到3分,

如果搜索字词在标记中匹配,则会得1分.

我怎么能重写我当前的查询来执行结果.

  • 文件1将获得:7分
  • 文件2将获得:4分

样本文件1

"title": "iphone 6 128G",
"tag": [
  "usa",
  "golden",
]
Run Code Online (Sandbox Code Playgroud)

样本文件2

"title": "iphone 4 64G",
"tag": [
  "usa",
  "golden",
]
Run Code Online (Sandbox Code Playgroud)

当前查询

  collection.aggregate(
     {
      "$match" => {
          "tag":{ "$in"=> q_params },
      }
     },
     { "$unwind" => "$tag" },
     { "$match" => { "tag"=> { "$in"=> q_params } } },
     { "$group" => { "_id"=> {"title":"$title"},
        "points"=> { "$sum"=>1 } } },
     { "$sort" => { "points"=> …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

4
推荐指数
1
解决办法
1279
查看次数

如何在MongoDB中拉出数组中项目的一个实例?

根据文件:

$ pull运算符从现有数组中删除与指定条件匹配的值的所有实例.

是否可以选择仅删除值的第一个实例?例如:

var array = ["bird","tiger","bird","horse"]
Run Code Online (Sandbox Code Playgroud)

如何在更新通话中直接删除第一个"鸟"?

mongodb node.js mongodb-query

4
推荐指数
2
解决办法
1595
查看次数

Mongodb聚合$ group后跟$限制分页

在MongoDB聚合管道中,从一个阶段到另一个阶段的记录流发生一次/批次(或)将等待当前阶段完成整个集合,然后再将其传递到下一阶段?

例如,我有一个带有以下样本记录的集合classtest

{name: "Person1", marks: 20}
{name: "Person2", marks: 20}
{name: "Person1", marks: 20}
Run Code Online (Sandbox Code Playgroud)

我有大约100名学生的1000条记录,我有以下聚合查询

    db.classtest.aggregate(
[
    {$sort: {name: 1}},
    {$group: {_id: '$name',
            total: {$sum: '$marks'}}},
    {$limit: 5}
])
Run Code Online (Sandbox Code Playgroud)

我有以下问题.

  1. 排序顺序在最终结果中丢失.如果我在$ group之后放置另一种排序,则结果会正确排序.这是否意味着$ group不维护以前的排序顺序?
  2. 我想将结果限制为5.在传递到限制之前,必须完成组操作(对于所有1000条记录).(或)当有记录时,组操作将记录传递到限制阶段,当满足限制阶段的要求时,停止处理?

我的实际想法是对聚合结果进行分页.在上面的场景中,如果$ group维护排序顺序并仅处理所需的记录数,我想$match condition {$ge: 'lastPersonName'}在后续页面查询中应用.

  1. 我不想在$ group之前应用$ limit,因为我想要5名学生的结果而不是前5个记录.
  2. 我可能不想使用$ skip,因为这意味着有效地遍历那些记录.

mongodb aggregation-framework

4
推荐指数
2
解决办法
2万
查看次数

Mongodb在组内聚合排序和限制

我有以下架构的待售物品集合:

var itemSchema = new Schema({
    "category" : { type : Schema.Types.ObjectId, ref : 'Category' },
    "merchant" : { type : Schema.Types.ObjectId, ref : 'Merchant' },
    "rating" : Number
})
Run Code Online (Sandbox Code Playgroud)

我继承了一个聚合查询,该查询返回与按类别划分的类别的项目,按商家分组,组按组中的最大评级排序:

Item.aggregate([
      { "$match" : { category : categoryId, merchant : { $ne : null }}},
      { "$group" : { _id : "$merchant", 
                    rating : { $max : "$rating" }, 
                    items : { $push : "$$ROOT" }}},
      { "$sort" : { rating : -1 }}
    ], { allowDiskUse : true …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

4
推荐指数
1
解决办法
4842
查看次数

当前字段的聚合条件计数

我正在尝试编写一个聚合来计算有多少文档具有某些字段(即只有它们存在时才计算它们).对象看起来像这样:

{
        "_id" : ObjectId("5617731fe65e0b19101c7039"),
        "dateCreated" : ISODate("2015-10-09T07:56:15.068Z"),
        "dateSent" : ISODate("2015-10-09T07:56:16.682Z"),
        "dateAttempted" : ISODate("2015-10-09T07:56:16.682Z")
},
{
        "_id" : ObjectId("561e37bb537d381bb0ef0ae2"),
        "dateCreated" : ISODate("2015-10-14T11:08:43.306Z"),
        "dateSent" : ISODate("2015-10-14T11:09:51.618Z"),
        "dateAttempted" : ISODate("2015-10-14T11:09:51.618Z"),
        "dateViewed" : ISODate("2015-10-15T10:09:50.618Z"),
        "dateOpened" : ISODate("2015-10-15T10:10:01.618Z")
}
Run Code Online (Sandbox Code Playgroud)

我想迭代所有文档,计算字段存在的位置.期望的输出:

{
        "total" : 1000,
        "created" : 1000,
        "sent" : 990,
        "attempted" : 995
        "viewed" : 800,
        "opened" : 750
}
Run Code Online (Sandbox Code Playgroud)

如果此输出可以每天分组,则可获得奖励积分!我不希望为范围中的每个日期执行新的聚合.

这是我到目前为止所做的,但是没有用; 它为每个字段返回零

[
  {
    "$group": {
      "_id": {
        "$dayOfMonth": "$dateCreated"
      },
      "total": {
        "$sum": 1
      },
      "sent": {
        "$sum": "$dateSent"
      },
      "attempted": { …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

4
推荐指数
1
解决办法
1436
查看次数

MongoDB C#从组中获取最新文档

我有一组假装付款的状态,每个都有付款ID.

我想获取每个付款ID的最新状态.测试我创建了一些虚拟数据然后尝试查询它.我到目前为止:

[Test]
public void GetPaymentLatestStatuses()
{
    var client = new TestMongoClient();

    var database = client.GetDatabase("payments");

    var paymentRequestsCollection = database.GetCollection<BsonDocument>("paymentRequests");

    var statusesCollection = database.GetCollection<BsonDocument>("statuses");

    var payment = new BsonDocument { { "amount", RANDOM.Next(10) } };

    paymentRequestsCollection.InsertOne(payment);

    var paymentId = payment["_id"];

    var receivedStatus = new BsonDocument
                         {
                             { "payment", paymentId },
                             { "code", "received" },
                             { "date", DateTime.UtcNow }
                         };
    var acceptedStatus = new BsonDocument
                         {
                             { "payment", paymentId },
                             { "code", "accepted" },
                             { "date", DateTime.UtcNow.AddSeconds(-1) }
                         };
    var completedStatus …
Run Code Online (Sandbox Code Playgroud)

c# mongodb mongodb-query aggregation-framework mongodb-.net-driver

4
推荐指数
1
解决办法
4048
查看次数

mongoose 对象方法不是函数

我正在尝试创建一条路线来为我的应用程序注册用户,但遇到了问题。当点击/register路线时,我收到以下错误:

TypeError: user.setPassword is not a function at 
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

模型/Users.js

var mongoose = require('mongoose');
var crypto = require('crypto');
var jwt = require('jsonwebtoken');

var UserSchema = new mongoose.Schema({
  username: {type: String, lowercase: true, unique: true},
  hash: String,
  salt: String
});

UserSchema.methods.setPassword = function(password){
  this.salt = crypto.randomBytes(16).toString('hex');
  this.hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');
};

UserSchema.methods.validPassword = function(password) {
  var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');
  return this.hash === hash;
};

UserSchema.methods.generateJWT = function() {

  // set expiration to 60 days …
Run Code Online (Sandbox Code Playgroud)

javascript mongoose node.js

4
推荐指数
1
解决办法
1万
查看次数

如何在架构内构造猫鼬架构?

我是mongodb的新手,我有一个像这样的数据模型

{
    last_updated: Date.now(),
    csgo_items:[
        {name: 'name', price: 1},
        {name: 'name', price: 1},
        {name: 'name', price: 1}
    ]
}
Run Code Online (Sandbox Code Playgroud)

我有一个“ last_updated”,然后有一个巨大的csgo物品清单。

我的问题是。我需要两个模式吗?一个是外层的两个属性,另一个是我的csgo项目模型的架构?

如果我这样做,我的模式将如何显示?

我有这样的项目架构。

var ItemSchema = new Schema({
    price: Number,
    name: String,
});
Run Code Online (Sandbox Code Playgroud)

我是否还需要另一个模式来为我的外部模式设置?

var CsgoSchema = new Schema({
    last_updated: Date,
    item: Array,
});
Run Code Online (Sandbox Code Playgroud)

它是否正确?

mongoose

4
推荐指数
1
解决办法
2260
查看次数