1

現在、次のようなmongoクエリを実行しています。

$query = array(
    'user_id' => $this->getUserId(),
    'name'    => $this->getName()
);

レコードが存在するかどうかを確認し、存在する場合は更新し、存在しない場合は作成します。

if(is_null($this->getId())) {
    $query['created'] = date('Y-m-d H:i:s');
    $this->collection->insert($query);
    $this->setId($query['_id']);
    return true;
} else {
    $conditions = array(
     '_id' => new \MongoId($this->getId())
    );
    return $this->collection->update($conditions, $query);
}

現在、レコードが新しい場合、「作成された」日付フィールドが追加されます。ただし、更新を実行すると、mongoDb は正しいレコードを戻すように見えますが、作成されたフィールドをそのままにしておくのではなく削除します。

$query$conditionsに追加しようとし'created' => $this->getCreated()ましたが、どちらも失敗しました。放置したいフィールドを削除する原因となる明らかな間違ったことはありますか?

4

2 に答える 2

2

あなたの問題に基づいて、モデルにcreatedプロパティが定義されており、ゲッターメソッドが機能している場合、「'created' => $this->getCreated() to the $query」を再試行することをお勧めします。挿入時の現在の日付、および更新時の事前設定されたプロパティ値。

于 2013-02-14T13:07:57.717 に答える
2

これはあなたの$query価値のためです。初心者にありがちなミスです。

次のように、クエリ ドキュメント全体を update に配置します。

$query = array(
    'user_id' => $this->getUserId(),
    'name'    => $this->getName()
);

演算子がないと、実際には元のドキュメントがこのドキュメントに置き換えられます。

$setこれらのフィールドの代わりに、次の新しい値を使用する必要があります$set

$query = array('$set' => array(
    'user_id' => $this->getUserId(),
    'name'    => $this->getName() )
);

これにより、希望する効果が得られるはずです。

于 2013-02-14T12:32:27.400 に答える