我想创建一个表,其中两个字段组合在一起形成一个索引字段.我创建表的Python代码如下.我想要做的是使组合字段course_name和group_name唯一,以便没有两个具有相同course_name和group_name可以创建的组.有人可以帮我这个吗?
class SocialGroup(Document):
timestamp = DateTimeField(default=datetime.now)
course_name = StringField()
group_name = StringField(choices=[('A', 1), ('B', 1), ('C', 1),('D', 1), ('E', 1), ('F', 1), ('None',1)], default="None")
Run Code Online (Sandbox Code Playgroud) 基本上我正在尝试根据其唯一的objectID(_id)更新Mongo数据库上的多个对象.我尝试了以下但他们没有工作:
var new_arr = [];
for (var i = 0; i < req.body.length; i++) {
// req.body is an array received from the POST request.
new_arr.push({"_id": new mongodb.ObjectID(req.body[i])})
}
console.log(new_arr);
// new_arr is not accepted since an object is expected.
job_applications.updateMany(
new_arr
,
{
$set: {"application_status": "rejected"}
}, function (err, results) {
console.log(results);
console.log(err);
if (!err) {
console.log('success with reject');
res.sendStatus(200);
}
}
);
Run Code Online (Sandbox Code Playgroud)
我也试过以下没有运气.
var job_applications = req.app.locals.job_applications;
var new_arr = [];
for (var i = 0; i < …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写将在SQLite查询不返回结果时执行的代码.但是,Node.js的异步性质使这很困难.我不知道我是否可以在回调函数中编写代码,因为当我使用将导致空结果的输入进行测试时,没有任何反应.
我正在做
db.each("SELECT pid, collection , photo FROM photos WHERE collection = '"+collection_id+"' AND pid = '"+photo_id+"' ", function(err, row) {
console.log("PHOTO FOUND");
//code inside the callback function
});
//code I want
Run Code Online (Sandbox Code Playgroud)
具体来说,我想渲染一些通用的东西,以防用户请求不在db中的内容我该怎么办?
由于我对RequireJS和Node.js(以及一般的JavaScript)的理解有限,我通常会看一些着名的JavaScript库的来源.每当我看到这样的事情:
( // Wrapping
function (root, factory) {
if (typeof exports === 'object') { // Node.js
var underscore = require('underscore');
var backbone = require('backbone');
module.exports = factory(underscore, backbone);
} else if (typeof define === 'function' && define.amd) { // Require.JS
define(['underscore', 'backbone'], factory);
}
}(this, function (_, Backbone) { // Factory function, the implementation
"option strict";
function Foo() {}
return Foo; // Export the constructor
})
); // Wrapping
Run Code Online (Sandbox Code Playgroud)
我能理解的(希望如此):
<script>标记中时,将自动执行包装代码的匿名函数if最开始检查); factory函数的结果既可以分配给module.exports(Node.js),也可以用作函数的 …什么是解决以下控制流程的最佳方法:
我只想调用getSomeOtherDataif someData等于某个值/通过一些条件测试
在这两种情况下,我总是想打电话 getMoreData
http.createServer(function (req, res) {
getSomeData(client, function(someData) {
// Only call getSomeOtherData if someData passes some conditional test
getSomeOtherData(client, function(someOtherData) {
// Always call getMoreData
getMoreData(client, function(moreData) {
res.end();
});
});
});
});
Run Code Online (Sandbox Code Playgroud) 这就是我想要的:我有一个叫做结果的大数组.我希望将该数组中的每个项放入我的迭代函数中并将其保存到我的mongoDB中(我在这里省略了一些不重要的步骤).在将这些项目中的每一项保存到数据库(或拒绝)之后,我希望console.log显示"All done".不幸的是,所有完成都会在调用系列后立即显示,而其他所有内容仍在处理中.我该怎么做?
我正在使用mongoose和一个名为'light'的模型,为了便于阅读,我省略了代码中的所有错误消息.我对eachSeries部分使用node-async
var async = require('async');
var results = [very big array]
var iteration = function(row,callbackDone) {
light.find({data: row.data}, function (err,entry) {
if(entry.length) {
callbackDone();
return console.log(entry + ' already exists');
}
var newEntry = new light(row);
newEntry.save(function (err,doc) {
console.log(entry + ' saved');
callbackDone();
});
});
};
async.eachSeries(results,iteration, function (err) {
console.log('All done');
});
Run Code Online (Sandbox Code Playgroud) 我的数据集看起来像
{"BrandId":"a","SessionId":100,"UserName":"tom"}
{"BrandId":"a","SessionId":200,"UserName":"tom"}
{"BrandId":"b","SessionId":300,"UserName":"mike"}
Run Code Online (Sandbox Code Playgroud)
我想用brandid计算不同的会话和用户名组,示例sql如下:
select brandid,count_distinct(sessionid),count_distinct(username)
from data
group by brandid
Run Code Online (Sandbox Code Playgroud)
我试着编写Mongo DB,我当前的代码如下,它不起作用.反正有没有让它工作?
db.logs.aggregate([
{$group:{
_id:{brand:"$BrandId",user:"$UserName",session:"$SessionId"},
count:{$sum:1}}},
{$group:{
_id:"$_id.brand",
users:{$sum:"$_id.user"},
sessions:{$sum:"$_id.session"}
}}
])
Run Code Online (Sandbox Code Playgroud)
对于某个例子,预期的数量是
{"BrandId:"a","countSession":2,"countUser":1}
{"BrandId:"b","countSession":1,"countUser":1}
Run Code Online (Sandbox Code Playgroud)
如果您了解SQL,则期望结果与我提到的SQL相同.
可以说我有一个与此结构嵌套的文档:
{
"_id": "a125",
"Language": null,
"Name": "Some name",
"Related": [{
"_id": "b125",
"Status": 0,
}, {
"_id": "b126",
"Status": 1,
}]
}
Run Code Online (Sandbox Code Playgroud)
是否可以使用c#驱动程序选择id为b126的“相关”模型,并同时获取父文档ID(a125)?
正如我想象的那样,结果应如下所示:
{
"_id": "a125",
"Related": {
"_id": "b126",
"Status": 1,
}
}
Run Code Online (Sandbox Code Playgroud) 我正在研究节点后端尝试通过mongoose优化对mongodb的非常繁重的查询.预期的返回大小是相当大的,但由于某些原因,当我发出请求时,节点开始消耗大量内存,例如200mb +用于单个大请求.
考虑到大多数情况下回报的大小小于10mb,这似乎不对.它在完成后也拒绝放弃内存,我知道这可能只是V8 GC执行其默认行为,但我担心的是单个find()请求消耗的大量内存.
我通过测试find()调用将其隔离了.完成调用后,它会执行一些后处理,然后将数据发送到回调,所有这些都在匿名函数中.我尝试使用querystream而不是model.find(),但它没有显示真正的改进.
环顾四周没有得到任何回应,所以我会问,是否有一种已知的方法来减少,控制或优化猫鼬的内存使用量?有谁知道为什么这么多的内存被用于一次通话?
编辑
根据Johnny和Blakes的建议,使用lean()和流的混合,并使用暂停和恢复,极大地改善了运行时和内存使用.谢谢!
mongodb ×7
node.js ×6
asynchronous ×2
javascript ×2
c# ×1
callback ×1
control-flow ×1
function ×1
memory ×1
module ×1
mongoengine ×1
mongomapper ×1
mongoose ×1
python ×1
requirejs ×1
sqlite ×1