标签: mongodb-query

如何在mongodb中更新多个数组元素

我有一个Mongo文档,其中包含一系列元素.

我想重置.handled数组中所有对象的属性.profile= XX.

该文件采用以下形式:

{
    "_id": ObjectId("4d2d8deff4e6c1d71fc29a07"),
    "user_id": "714638ba-2e08-2168-2b99-00002f3d43c0",
    "events": [{
            "handled": 1,
            "profile": 10,
            "data": "....."
        } {
            "handled": 1,
            "profile": 10,
            "data": "....."
        } {
            "handled": 1,
            "profile": 20,
            "data": "....."
        }
        ...
    ]
}
Run Code Online (Sandbox Code Playgroud)

所以,我尝试了以下内容:

.update({"events.profile":10},{$set:{"events.$.handled":0}},false,true)
Run Code Online (Sandbox Code Playgroud)

但是,它仅更新每个文档中第一个匹配的数组元素.(这是$的定义行为- 位置运算符.)

如何更新所有匹配的数组元素?

arrays mongodb mongodb-query

171
推荐指数
9
解决办法
10万
查看次数

mongodb:如果不存在则插入

每天,我收到一份文件(更新).我想要做的是插入每个尚不存在的项目.

  • 我还想跟踪我第一次插入它们,以及最后一次在更新中看到它们.
  • 我不想要有重复的文件.
  • 我不想删除以前保存过的文档,但不在我的更新中.
  • 95%(估计)的记录每天都未经修改.

我正在使用Python驱动程序(pymongo).

我目前做的是(伪代码):

for each document in update:
      existing_document = collection.find_one(document)
      if not existing_document:
           document['insertion_date'] = now
      else:
           document = existing_document
      document['last_update_date'] = now
      my_collection.save(document)
Run Code Online (Sandbox Code Playgroud)

我的问题是它非常慢(少于100 000条记录需要40分钟,而且我在更新中有数百万条记录).我很确定有内置的东西可以做到这一点,但更新()的文件是mmmhhh ....有点简洁....(http://www.mongodb.org/display/DOCS/Updating)

有人可以建议如何更快地做到这一点?

python bulkinsert mongodb mongodb-query

126
推荐指数
7
解决办法
13万
查看次数

包括所有现有字段并向文档添加新字段

我想定义一个$ project聚合阶段,我可以指示它添加一个新字段并包含所有现有字段,而不必列出所有现有字段.

我的文档看起来像这样,有很多字段:

{
    obj: {
        obj_field1: "hi",
        obj_field2: "hi2"
    },
    field1: "a",
    field2: "b",
    ...
    field26: "z"
}
Run Code Online (Sandbox Code Playgroud)

我想做一个像这样的聚合操作:

[
    {
        $project: {
            custom_field: "$obj.obj_field1",
            //the next part is that I don't want to do
            field1: 1,
            field2: 1,
            ...
            field26: 1
        }
    },
    ... //group, match, and whatever...
]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可以使用类似"包含所有字段"的关键字,还是以其他方式避免必须单独列出每个字段?

mongodb mongodb-query aggregation-framework

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

MongoDB:如何查询字段为null或未设置的记录?

我有一个Emailsent_at日期字段的文件:

{
  'sent_at': Date( 1336776254000 )
}
Run Code Online (Sandbox Code Playgroud)

如果Email尚未发送,则该sent_at字段为空或不存在.

我需要得到所有已发送/未发送的计数Emails.我一直试图找出查询此信息的正确方法.我认为这是获得发送计数的正确方法:

db.emails.count({sent_at: {$ne: null}})
Run Code Online (Sandbox Code Playgroud)

但是我应该如何计算未发送的数量呢?

null exists mongodb mongodb-query

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

获取mongodb系列的最新记录

我想知道一个集合中的最新记录.怎么做?

注意:我知道以下命令行查询有效:

1. db.test.find().sort({"idate":-1}).limit(1).forEach(printjson);
2. db.test.find().skip(db.test.count()-1).forEach(printjson)
Run Code Online (Sandbox Code Playgroud)

其中idate添加了时间戳.

问题是收集是时候收回数据的时间越长,我的"测试"集合真的非常庞大.我需要一个具有恒定时间响应的查询.

如果有任何更好的mongodb命令行查询,请告诉我.

mongodb mongodb-query

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

mongodb计数每个字段/键的不同值的数量

是否存在用于计算字段在DB中包含多少个不同值的查询.

我有一个国家的领域,有8种国家价值观(西班牙,英格兰,法国等...)

如果有人在新国家/地区添加了更多文档,我希望查询返回9.

是否有更容易的方式然后分组和计数?

mongodb mongodb-query aggregation-framework

90
推荐指数
7
解决办法
12万
查看次数

如何在MongoDB中使用'Not Like'运算符

我使用pymongo的SQL'Like'运算符,

db.test.find({'c':{'$regex':'ttt'}})
Run Code Online (Sandbox Code Playgroud)

但是我如何使用'不喜欢'运算符?

我试过了

db.test.find({'c':{'$not':{'$regex':'ttt'}})
Run Code Online (Sandbox Code Playgroud)

regex mongodb pymongo mongodb-query sql-like

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

$ find在数组中的ObjectId

在一个ObjectIds数组而不仅仅是一个ObjectId的字段上执行$ lookup的语法是什么?

示例订单文档:

{
  _id: ObjectId("..."),
  products: [
    ObjectId("..<Car ObjectId>.."),
    ObjectId("..<Bike ObjectId>..")
  ]
}
Run Code Online (Sandbox Code Playgroud)

不工作查询:

db.orders.aggregate([
    {
       $lookup:
         {
           from: "products",
           localField: "products",
           foreignField: "_id",
           as: "productObjects"
         }
    }
])
Run Code Online (Sandbox Code Playgroud)

期望的结果

{
  _id: ObjectId("..."),
  products: [
    ObjectId("..<Car ObjectId>.."),
    ObjectId("..<Bike ObjectId>..")
  ],
  productObjects: [
    {<Car Object>},
    {<Bike Object>}
  ],
}
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

86
推荐指数
5
解决办法
8万
查看次数

如何使用MongoDB过滤子文档中的数组

我有像这样的子文档数组

{
    "_id" : ObjectId("512e28984815cbfcb21646a7"),
    "list" : [
        {
            "a" : 1
        },
        {
            "a" : 2
        },
        {
            "a" : 3
        },
        {
            "a" : 4
        },
        {
            "a" : 5
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我可以过滤子文档> 3

我期待下面的结果

{
    "_id" : ObjectId("512e28984815cbfcb21646a7"),
    "list" : [
        {
            "a" : 4
        },
        {
            "a" : 5
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用$elemMatch但返回数组中的第一个匹配元素

我的查询:

db.test.find( { _id" : ObjectId("512e28984815cbfcb21646a7") }, { 
    list: { 
        $elemMatch: 
            { a: { $gt:3 } 
            } 
    } 
} ) …
Run Code Online (Sandbox Code Playgroud)

filter mongodb mongodb-query aggregation-framework

81
推荐指数
3
解决办法
9万
查看次数

溢出排序阶段缓冲数据使用超出内部限制

使用代码:

all_reviews = db_handle.find().sort('reviewDate', pymongo.ASCENDING)
print all_reviews.count()

print all_reviews[0]
print all_reviews[2000000]
Run Code Online (Sandbox Code Playgroud)

计数打印2043484,然后打印all_reviews[0].

但是在打印时all_reviews[2000000],我收到错误:

pymongo.errors.OperationFailure:数据库错误:运行程序错误:溢出排序阶段缓冲数据使用量33554495字节超过内部限制33554432字节

我该如何处理?

mongodb mongodb-query mongodb-indexes

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