2015-08-04 3 views
3

Я использую следующий код для вставки данных в MongoDBсоздать новый объект Id в MongoDB используя узел JS

router.post('/NewStory', function (req, res) { 
var currentObject = { user: userId , story : story , _id:new ObjectID().toHexString() }; 
     req.db.get('clnTemple').findAndModify({ 
      query: { _id: req.body.postId }, 
      update: { $addToSet: { Stories: currentObject } }, 
      upsert: true 
     }); 
}); 

Этот код работает отлично, если я удалить _id:new ObjectID().toHexString()

Что я хочу достичь вот что для каждой новой истории я хочу уникальный _id объект для прикрепления к нему

Что я делаю неправильно?

{ 
    "_id": { 
     "$oid": "55ae24016fb73f6ac7c2d640" 
    }, 
    "Name": "some name", 
    ...... some other details 
    "Stories": [ 
     { 
      "userId": "105304831528398207103", 
      "story": "some story" 
     }, 
     { 
      "userId": "105304831528398207103", 
      "story": "some story" 
     } 
    ] 
} 

Это модель документа, то _id, что я пытаюсь создать для историй

+2

вам не нужно делать это MongoDB автоматически создаст _id собственность как стоимость создания эксклюзивного ид – Ahmer

+0

где это ObjectID инициализирован – Ahmer

ответ

3

Вы не должны называть .toHexString() на это, как вы будете получать «строка» и не ObjectID. Строка занимает больше места, чем байты ObjectId.

var async = require('async'), 
    mongo = require('mongodb'), 
    db = require('monk')('localhost/test'), 
    ObjectID = mongo.ObjectID; 


var coll = db.get('junk'); 

var obj = { "_id": new ObjectID(), "name": "Bill" }; 

coll.findAndModify(
    { "_id": new ObjectID() }, 
    { "$addToSet": { "stories": obj } }, 
    { 
    "upsert": true, 
    "new": true 
    }, 
    function(err,doc) { 
    if (err) throw err; 
    console.log(doc); 
    } 
) 

Так что это прекрасно работает для меня. Отмечая здесь «новый» вариант, поэтому возвращается измененный документ, а не исходная форма документа, который является значением по умолчанию.

{ _id: 55c04b5b52d0ec940694f819, 
    stories: [ { _id: 55c04b5b52d0ec940694f818, name: 'Bill' } ] } 

Существует, однако поймать здесь, и это то, что если вы используете $addToSet и генерации нового ObjectId для каждого элемента, то, что новый ObjectId делает все «уникальным». Таким образом, вы продолжаете добавлять вещи в «набор». Это может также быть $push, если это то, что вы хотите сделать.

Так что если userId и story в сочетании уже делают это «уникальный», то сделать так, вместо этого:

coll.findAndModify(
    { 
     "_id": docId, 
     "stories": { 
      "$not": { "$elemMatch": { "userId": userId, "story": story } } 
     } 
    }, 
    { "$push": { 
    "stories": { 
     "userId": userId, "story": story, "_id": new ObjectID() 
    } 
    }}, 
    { 
    "new": true 
    }, 
    function(err,doc) { 
    if (err) throw err; 
    console.log(doc); 
    } 
) 

Так тест на наличие уникальных элементов в массиве, и где они не существуют затем добавьте их в массив. Также отмечая, что вы не можете выполнить «соответствие неравенства» в элементе массива при смешивании с «upserts». Ваш тест на «обновление» документа должен быть только на основном значении «_id». Управление записями массива и документами «upserts» необходимо выполнять в отдельных операциях обновления. Не пытайтесь смешивать эти два, иначе вы в конечном итоге создадите новые документы, когда не намеревались.

+0

благодаря я использовал один и тот же код и он работал удалила асинхра в одиночку это будет иметь какие-либо серьезные последствия –

+0

Идентификатор пользователя и история не будут делать уникальный ключ в моем сценарии, так как один пользователь может добавить несколько историй. –

+0

@vignesh Вот почему я говорю «ЕСЛИ», это так. Однако нужно знать, что каждый раз создавая «новое» значение ObjectId, вы сворачиваете необходимость в '$ addToSet'. По определению каждый «новый» элемент, добавленный в массив, всегда «уникален». –

3

Кстати, вы можете создать ObjectID, используя monk.

var db = monk(credentials.database); 

var ObjectID = db.helper.id.ObjectID 

console.log(ObjectID()) // generates an ObjectID 
Смежные вопросы