Как вернуть ObjectId или _id документа в MongoDB? и ошибка $in нуждается в массиве

У меня есть документ в MongoDB, и я хотел бы получить ObjectId этого документа, но я не нашел пока метода, который делает это для меня.

Пример запроса:

 user= db.users.find({userName:"Andressa"})

Это возвращает это:

 { "_id" : ObjectId("53b1c579bdf3de74f76bdac9"), "userid" : 0, "userName" : "Andressa", "userEmail" : "[email protected]", "teams" : [ 1, 2, 3 ] }

Я хочу получить ObjectId для выполнения другого запроса.

Пример:

 userID =  `user._id();` //but this does not work, of course, its an example

Итак, я мог бы использовать ObjectId для выполнения другого запроса, подобного этому:

 userFind = db.users.find({_id: userID})

ОБНОВЛЕНИЕ: этот код:

 db.teams.find({_id:{$in: user.teams}})

возвращает эту ошибку:

error: {
    "$err" : "Can't canonicalize query: BadValue $in needs an array",
    "code" : 17287

Кто-нибудь это знает?


person AndBecaPine    schedule 03.07.2014    source источник
comment
Как вы только что вернули поле _id? например У меня есть способ вернуть поле objectId для редактирования и обновления пользовательского документа. Большое спасибо!   -  person Stu_Dent    schedule 10.10.2020


Ответы (6)


В оболочке mongo вы можете использовать это для получения _id :

user._id.str

or

user._id.toString()

См. документацию: http://docs.mongodb.org/manual/reference/method/ObjectId.valueOf/

person kranteg    schedule 03.07.2014
comment
Спасибо за ваш ответ. Я действительно нашел ошибку. - person AndBecaPine; 03.07.2014

Я понял! На самом деле, я мог бы сделать это с помощью этого кода:

Вместо того, чтобы просто:

user = db.users.findOne({userName:"And"})

Я сделал только что:

  var user = db.users.findOne({userName:"And"})

а также

  user._id 

возвращает ObjectId("someId") , если я хочу сохранить его в какой-то переменной, которую я делаю:

var Id = user._id. 

По второму вопросу не знаю.

person AndBecaPine    schedule 03.07.2014
comment
Прошло 3 года, может кому пригодится: db.users.find({userName: "And"})[0]._id - person dodo254; 16.09.2017

Я столкнулся с тем, что, по моему мнению, является той же проблемой - как получить ObjectId из неизвестного документа монго. Я создал общий контекст данных и нуждался в _id в моих методах обновления и удаления. Найдя ваш вопрос во время поиска ответа о том, как это сделать, я решил опубликовать то, что, наконец, сработало для меня.

private BsonValue GetId<TEntity>(TEntity entity)
{
    var bsonDoc = entity.ToBsonDocument();
    return bsonDoc.GetElement("_id").Value;
}

Затем я использую его примерно так:

 var id = GetId<TEntity>(entity);
 var filter = builder.Eq("_id", id);
 var doc = collection.Find(filter).SingleOrDefault();

Надеюсь это поможет.

person GeekerMode    schedule 01.02.2017

Для этого вы можете использовать метод find().

Метод db.collection.find() не возвращает фактический документ, но возвращает курсор к документу. перебирая курсор, вы увидите поля в этом документе.

Код :

    var cursor=db.collection.find()

    var objectId= cursor.next()._id

приведенный выше оператор получает значение ObjectId из текущего экземпляра курсора. если вы получите все objectId, то, перебирая курсор, вы получите все значения ObjectId.

Чтобы найти документ напрямую, используя objectId, полученный на первом шаге, вы можете использовать следующий фрагмент кода:

       db.collection.find( { "_id": objectId},{ fields Of Your Choice } )
person DanglingPointer    schedule 29.07.2014

Попробуйте это (для Node v12.16.3/MongoDB MongoDB v4.2.6)

// find if a value exists
collection.find({ "criteria1": value1, "criteria2": value2 }).toArray
(function(err, doc) {

    if (err) {
        console.log('Error, Please Try Again');
    }
    else if (doc.length === 0) {
        console.log('Does Not Exist');
    } else {
        console.log(doc);
        console.log(doc[0]._id)
    }
});
person DragonFire    schedule 18.05.2020

С диском MongoDB Node.js и деструктуризацией ES6

const { _id } = db.collection("users").findOne({ userName:"Andressa" })

Или, что еще лучше, переименовать его при реструктуризации...

const { _id: userId } = db.collection("users").findOne({ userName:"Andressa" })

Затем вы можете использовать userId в своем коде по мере необходимости...

person PJately    schedule 30.06.2020