Javascript Mongodb,在插入新值之前检查对象/模型的数组
我正在使用以下功能为“出价”注册用户。用户有一个bids数组,该数组将把出价放入数组中,并将其保存为用户模型的一部分。我正在使用以下功能来完成此操作:Javascript Mongodb,在插入新值之前检查对象/模型的数组,javascript,arrays,node.js,mongodb,Javascript,Arrays,Node.js,Mongodb,我正在使用以下功能为“出价”注册用户。用户有一个bids数组,该数组将把出价放入数组中,并将其保存为用户模型的一部分。我正在使用以下功能来完成此操作: // Register client for bid module.exports.register = function(info, callback) { client_username = info['client_username']; bid_id = info['bid_id']; bid_title
// Register client for bid
module.exports.register = function(info, callback) {
client_username = info['client_username'];
bid_id = info['bid_id'];
bid_title = info['bid_title'];
var query = {username: client_username};
Client.findOneAndUpdate(
query,
{$addToSet: {"bids": {bid_id: bid_id, bid_title: bid_title}}},
{safe: true, upsert: true},
callback
);
}
问题是,我没有检查客户的出价数组中是否已经有此出价。我不太了解mongoDb和js,在使用$addToSet并将新的bid添加到数组之前,我无法检查bids数组。然而,我认为$addToSet应该这样做
有人知道我如何迭代用户的bids数组来检查我推送到数组中的bid是否已经存在于数组中吗?请参阅下面的整个投标模型和客户模型
var mongoose = require('mongoose');
// client Schema
var clientSchema = mongoose.Schema({
first_name: {
type: String
},
last_name: {
type: String
},
address: [{
street_address:{type: String},
city:{type: String},
state:{type: String},
zip:{type: String}
}],
username: {
type: String
},
email: {
type: String
},
bids:[{
bid_id:{type: [mongoose.Schema.Types.ObjectId]},
bid_title: {type:String}
}]
});
var Client = module.exports = mongoose.model('Client', clientSchema);
module.exports.getClientByUsername = function(username, callback){
var query = {username: username};
Client.findOne(query, callback);
}
// Register client for bid
module.exports.register = function(info, callback) {
client_username = info['client_username'];
bid_id = info['bid_id'];
bid_title = info['bid_title'];
var query = {username: client_username};
Client.findOneAndUpdate(
query,
{$addToSet: {"bids": {bid_id: bid_id, bid_title: bid_title}}},
{safe: true, upsert: true},
callback
);
}
您可以向模型中添加一个方法,这里是一个粗略的切割:
clientSchema.methods.addBid = function (bid, cb) {
/* Check the array here */
for (var i = 0; i < this.bids.length; i++){
if (this.bids[i].title == bid.bid_title) {
/* do something */
var error = true;
cb("Bid already exists",this);
}
}
if(!error){
this.bids.push({
"bid_id" : bid.bid_id,
"bid_title" : bid.bid_title
});
cb(undefined,this);
});
};
您可以向模型中添加一个方法,这里是一个粗略的切割:
clientSchema.methods.addBid = function (bid, cb) {
/* Check the array here */
for (var i = 0; i < this.bids.length; i++){
if (this.bids[i].title == bid.bid_title) {
/* do something */
var error = true;
cb("Bid already exists",this);
}
}
if(!error){
this.bids.push({
"bid_id" : bid.bid_id,
"bid_title" : bid.bid_title
});
cb(undefined,this);
});
};
我想您应该使用$elemMatch关键字:
为了提高效率,假设您对模式有任何控制权,我认为您应该将上述内容更改为具有哈希键的对象,然后对bid id进行点表示查询。我认为您应该使用$elemMatch关键字:
为了提高效率,假设您对模式有任何控制权,我认为您应该将上述内容更改为具有哈希键的对象,然后对bid id进行点表示查询。我在MongoDB实例上进行了本地测试。使用FindAndModify()时,$AddtoSet仅在数组中不存在新bid时添加新bid。如果它存在,它不会做任何事情。这是我使用的查询:
db.collection.findAndModify({
query: {
"username": "ag102"
},
update: {
$addToSet: {
"bids": {
"bid_id": 6,
"bid_title": "ebay6"
}
}
},
upsert: true
});
我在我的MongoDB实例上进行了本地测试。使用FindAndModify()时,$AddtoSet仅在数组中不存在新bid时添加新bid。如果它存在,它不会做任何事情。这是我使用的查询:
db.collection.findAndModify({
query: {
"username": "ag102"
},
update: {
$addToSet: {
"bids": {
"bid_id": 6,
"bid_title": "ebay6"
}
}
},
upsert: true
});